[c語言日寄]檢查環形鏈表

在這里插入圖片描述

【作者主頁】siy2333
【專欄介紹】?c語言日寄?:這是一個專注于C語言刷題的專欄,精選題目,搭配詳細題解、拓展算法。從基礎語法到復雜算法,題目涉及的知識點全面覆蓋,助力你系統提升。無論你是初學者,還是進階開發者,這里都能滿足你的需求!
【食用方法】1.根據題目自行嘗試 2.查看基礎思路完善題解 3.學習拓展算法
【Gitee鏈接】資源保存在我的Gitee倉庫:https://gitee.com/siy2333/study


文章目錄

  • 前言
  • 題目引入
  • 知識點分析
    • 1. 鏈表的基本概念
    • 2. 快慢指針法
    • 3. 指針操作
  • 注意事項
    • 1. 空鏈表和單節點鏈表
    • 2. 指針越界問題
    • 3. 時間復雜度和空間復雜度
  • 拓展應用
    • 1. 找到環的入口
    • 2. 判斷環的長度
  • 總結


前言

在數據結構的學習中,鏈表是一種非常常見的線性結構,而環形鏈表問題則是鏈表問題中的經典之一。環形鏈表是指鏈表的尾節點指向鏈表中的某個節點,從而形成一個環。判斷鏈表中是否存在環是許多算法問題的基礎,也是面試中常見的考點。今天,我們就通過一個具體的題目來深入探討如何檢測環形鏈表。


題目引入

判斷鏈表中是否有環
給定一個鏈表的頭節點 head,判斷鏈表中是否存在環。如果鏈表中存在環,則返回 true;否則返回 false

例如:

  • 輸入:head = [3,2,0,-4]pos = 1pos 表示尾節點連接到鏈表中的位置,從 0 開始)
  • 輸出:true
  • 解釋:鏈表中存在環,尾節點連接到第二個節點。

這個問題看似簡單,但背后涉及到了鏈表的遍歷、指針操作以及算法的設計。接下來,我們將逐步分析如何解決這個問題。

知識點分析

1. 鏈表的基本概念

鏈表是一種線性數據結構,由一系列節點組成,每個節點包含兩部分:

  • 數據域:存儲數據。
  • 指針域:存儲指向下一個節點的指針。

對于環形鏈表問題,我們需要特別關注指針域,因為它決定了鏈表的結構。

2. 快慢指針法

解決環形鏈表問題的核心思想是使用快慢指針法。快慢指針法是一種常見的鏈表操作技巧,通過設置兩個指針(一個快指針和一個慢指針)來遍歷鏈表。具體步驟如下:

  • 慢指針:每次移動一步。
  • 快指針:每次移動兩步。

如果鏈表中存在環,快指針和慢指針最終會在環內相遇;如果鏈表中沒有環,快指針會先到達鏈表的末尾。

3. 指針操作

在鏈表操作中,指針的使用至關重要。我們需要熟練掌握如何通過指針訪問和修改鏈表節點。例如:

  • 使用 node->next 訪問下一個節點。
  • 使用 node = node->next 移動指針。

在環形鏈表問題中,指針的正確操作是實現快慢指針法的基礎。

注意事項

1. 空鏈表和單節點鏈表

在實現算法時,需要特別注意鏈表為空或只有一個節點的情況。對于這兩種情況,鏈表中顯然不存在環,因此可以直接返回 false

if (head == NULL || head->next == NULL) {return false;
}

2. 指針越界問題

在鏈表操作中,需要確保指針不會越界。特別是在快指針每次移動兩步時,必須先檢查 fastfast->next 是否為 NULL

while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return true;}
}

3. 時間復雜度和空間復雜度

快慢指針法的時間復雜度為 O(n),其中 n 是鏈表的長度。這是因為快指針最多遍歷鏈表兩次。空間復雜度為 O(1),因為我們只使用了兩個指針,不需要額外的存儲空間。

拓展應用

1. 找到環的入口

除了判斷鏈表中是否存在環,我們還可以進一步找到環的入口。這是快慢指針法的一個重要拓展應用。

當快指針和慢指針相遇后,我們可以通過以下步驟找到環的入口:

  1. 將慢指針重置為鏈表的頭節點。
  2. 快指針保持在相遇點。
  3. 快指針和慢指針都每次移動一步,直到它們再次相遇。相遇點即為環的入口。

代碼實現如下:

struct ListNode *detectCycle(struct ListNode *head) {if (head == NULL || head->next == NULL) {return NULL;}struct ListNode *slow = head;struct ListNode *fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;if (slow == fast) {break;}}if (fast == NULL || fast->next == NULL) {return NULL;}slow = head;while (slow != fast) {slow = slow->next;fast = fast->next;}return slow;
}

2. 判斷環的長度

在找到環的入口后,我們還可以進一步計算環的長度。方法是從環的入口開始,使用一個指針遍歷環,直到再次回到入口。

代碼實現如下:

int cycleLength(struct ListNode *head) {struct ListNode *entry = detectCycle(head);if (entry == NULL) {return 0;}struct ListNode *temp = entry;int length = 0;do {temp = temp->next;length++;} while (temp != entry);return length;
}

總結

通過上述分析和代碼實現,我們詳細探討了如何檢測環形鏈表,并進一步找到了環的入口和環的長度。快慢指針法是一種非常高效且優雅的算法,它不僅能夠解決環形鏈表問題,還可以應用于其他鏈表相關問題。

希望這篇文章能幫助你更好地理解和掌握鏈表操作和快慢指針法。如果你對鏈表或其他數據結構感興趣,可以繼續關注我的博客,我會定期分享更多優質內容。

[專欄鏈接QwQ] :?c語言日寄?CSDN
[關注博主ava]:siy2333
感謝觀看~ 我們下次再見!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903711.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

黃雀在后:外賣大戰新變局,淘寶+餓了么開啟電商大零售時代

當所有人以為美團和京東的“口水戰”硝煙漸散,外賣大戰告一段落時,“螳螂捕蟬,黃雀在后”,淘寶閃購聯合餓了么“閃現”外賣戰場,外賣烽火再度燃起。 4 月30日,淘寶天貓旗下即時零售業務“小時達”正式升級…

如何在uni-app中自定義輸入框placeholder的樣式

在開發uni-app應用時&#xff0c;我們經常需要自定義輸入框&#xff08;<input>&#xff09;的樣式以匹配應用的整體設計。默認情況下&#xff0c;uni-app的輸入框提供了一些基本的樣式選項&#xff0c;但有時候我們需要更細致地控制輸入框的每個部分&#xff0c;例如pla…

使用Node編寫輕量級后端快速入門

使用Node編寫輕量級后端快速入門 node 要作為輕量級后端需要下載一些對應模塊可以參考下面命令。你可以借助 npm&#xff08;Node Package Manager&#xff09;來下載它們。 模塊下載 express&#xff1a;這是一個廣受歡迎的 Node.js Web 應用框架&#xff0c;能用于構建 Web…

從Markdown到專業文檔:如何用Python打造高效格式轉換工具

在技術寫作、學術研究和企業報告領域,Markdown因其簡潔高效的特性廣受開發者喜愛。但當需要輸出正式文檔時,Word和PDF格式仍是行業標準。傳統解決方案往往存在樣式丟失、代碼排版混亂、批量處理困難等痛點。本文將揭秘如何用Python構建一個支持多主題、保留代碼高亮、自動生成…

【docker學習筆記】如何刪除鏡像啟動默認命令

一些鏡像會在它打鏡像時&#xff0c;加入一些默認的啟動命令&#xff0c;可以通過docker inspect \<image id\>來查看Entrypoint。如下圖&#xff0c;docker run啟動時&#xff0c;會默認執行 "python3 -m vllm.entrypoints.openai.api_server" 如果不想執行&…

任意無人機手柄鏈接Unity-100元的鳳凰SM600手柄接入Unity Input System?

網上教程真少&#xff01;奮發圖強自力更生&#xff01;2025.5.1 目前有用的鏈接&#xff1a; unity如何添加自定義HID設備&#xff0c;自己開發的手柄如何支持unity。 - 嗶哩嗶哩 HID Support | Input System | 1.0.2 官方教程 https://zhuanlan.zhihu.com/p/503209742 分…

2024睿抗CAIP-編程技能賽-本科組(省賽)題解

藍橋杯拿了個省三&#xff0c;天梯沒進1隊&#xff0c;睿抗是我最后的機會 RC-u4 章魚圖的判斷 題目描述 對于無向圖 G ( V , E ) G(V,E) G(V,E)&#xff0c;我們定義章魚圖為&#xff1a; 有且僅有一個簡單環&#xff08;即沒有重復頂點的環&#xff09;&#xff0c;且所…

Java 泛型參數問題:‘ResponseData.this‘ cannot be referenced from a static contex

問題與處理策略 問題描述 Data AllArgsConstructor NoArgsConstructor public class ResponseData<T> {private Integer code;private String msg;private T data;public static final int CODE_SUCCESS 2001;public static final int CODE_FAIL 3001;public static …

用TCP實現服務器與客戶端的交互

目錄 一、TCP的特點 二、API介紹 1.ServerSocket 2.Socket 三、實現服務器 四、實現客戶端 五、測試解決bug 1.客戶端發送了數據之后&#xff0c;并沒有響應 2.clientSocket沒有執行close()操作 3.嘗試使用多個客戶端同時連接服務器 六、優化 1.短時間有大量客戶端訪…

鳥籠效應——AI與思維模型【84】

一、定義 鳥籠效應思維模型指的是人們在偶然獲得一件原本不需要的物品后,會為了這件物品的配套或使用需求,進而繼續添加更多與之相關但自己原本可能并不需要的東西,仿佛被這個“鳥籠”牽著走,最終陷入一種慣性消費或行為模式的現象。簡單來說,就是人們在心理上會有一種自…

加密解密記錄

一、RSA 加密解密 密鑰對生成 1.前端加密解密 &#xff08;1&#xff09;.vue頁面引入 npm install jsencrypt&#xff08;2&#xff09;工具 jsencrypt.js import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密鑰對生成 http://web.chacuo.net/netrsakeypairconst p…

淺析 MegEngine 對 DTR 的實現與改進

分享筆者在學習 MegEngine 對 DTR 的實現時的筆記。關于 DTR 可以參考&#xff1a;【翻譯】DTR_ICLR 2021 文章目錄 MegEngine 架構設計MegEngine 的動態圖部分Imperative RuntimeImperative 與 MegDNN / MegBrain 的關系靜態圖運行時管家 —— MegBrain動態圖接口 —— Impera…

micro-app前端微服務原理解析

一、核心設計思想 基于 WebComponents 的組件化渲染 micro-app 借鑒 WebComponents 的 CustomElement 和 ShadowDom 特性&#xff0c;將子應用封裝為類似 WebComponent 的自定義標簽&#xff08;如 <micro-app>&#xff09;。通過 ShadowDom 的天然隔離機制&#xff0c;實…

CMake中強制啟用option定義變量的方法

在CMake中&#xff0c;若要在另一個CMake文件中強制啟用由option()定義的變量&#xff0c;可使用set(... FORCE)覆蓋緩存變量。具體步驟如下&#xff1a; 使用set命令強制覆蓋緩存&#xff1a; 在需要強制啟用選項的CMake文件中&#xff0c;使用set命令并指定CACHE和FORCE參數。…

C++漫溯鍵值的長河:map set

文章目錄 1.關聯式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的應用實踐&#xff1a;隨機鏈表的復制 5.multimap希望讀者們多多三連支持小編會繼續更新你們的鼓勵就是我前進的動…

汽車用品商城小程序源碼介紹

基于ThinkPHPFastAdminUniApp開發的汽車用品商城小程序源碼&#xff0c;從技術架構來看&#xff0c;ThinkPHP作為后端框架&#xff0c;提供了穩定且高效的開發基礎&#xff0c;能夠處理復雜的業務邏輯和數據交互。FastAdmin則進一步簡化了后臺管理系統的開發流程&#xff0c;提…

力扣hot100——114.二叉樹展開為鏈表

基于 Morris 遍歷思想 將左子樹插到右子樹的位置&#xff0c;將原來的右子樹插到左子樹的最右結點&#xff0c;遍歷右結點重復以上步驟&#xff0c;直至右結點為空。 class Solution { public:void flatten(TreeNode* root) {if(rootnullptr) return;while(root){if(!root-&g…

JConsole監控centos服務器中的springboot的服務

場景 在centos服務器中,有一個aa.jar的springboot服務,我想用JConsole監控它的JVM情況,具體怎么實現。 配置 Spring Boot 應用以啟用 JMX 在java應用啟動項進行配置 java -Djava.rmi.server.hostname=服務器IP -Dcom.sun.management.jmxremote=true \ -Dcom.sun.managem…

39.RocketMQ高性能核心原理與源碼架構剖析

1. 源碼環境搭建 1.1 主要功能模塊 ? RocketMQ的官方Git倉庫地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ? RocketMQ的官方網站上下載指定版…

施磊老師rpc(一)

文章目錄 mprpc項目**項目概述**&#xff1a;深入學習到什么**前置學習建議**&#xff1a;核心內容其他技術與工具**項目特點與要求**&#xff1a;**環境準備**&#xff1a; 技術棧集群和分布式理論單機聊天服務器案例分析集群聊天服務器分析分布式系統介紹多個模塊的局限引入分…