單鏈表中查詢環的開始節點
已知壹個連結串列,尾節點錯誤的指向了本身,形成了帶一段單鏈表的環連結串列;頭結點已知,連結串列長度未知,求節點環的開始節點
/* (Step 1) Find the meeting point. This algorithm moves two pointers at
* different speeds: one moves forward by 1 node, the other by 2. They
* will always pass the slower one!). If the loop starts k nodes after the
* start of the list, they will meet at k nodes from the start of the
* loop. */
n1 = n2 = head;
while (TRUE) {
n1 = n1->next;
n2 = n2->next->next;
if (n1 == n2) {
break;
}
}
/* Find the start of the loop.*/
n1 = head;
while (n1->next != n2->next) {
n1 = n1->next;
n2 = n2->next;
}
/*Now n2 points to the start of the loop.*/
關於查詢環連結串列的開始節點:
假設單鏈表長度為L,環形連結串列長度為K,由於設定了快慢指標,快慢指標一定會在環形連結串列的某一點相遇,假設該節點距離環形連結串列開始距離為a.那麼可以得到這樣的一個結論:慢指標走的距離=L+a,快指標的走的距離=L+a+k*n,此時,讓慢指標從頭再走,走L的時間正好是快指標走完剩下的路程k-a+(n-1)*k。
相關推薦
單鏈表中查詢環的開始節點
已知壹個連結串列,尾節點錯誤的指向了本身,形成了帶一段單鏈表的環連結串列;頭結點已知,連結串列長度未知,求節點環的開始節點 /* (Step 1) Find the meeting point. This algorithm moves two pointers at
鏈表中的環入口節點
gpo log blog entry || return amp ret head public class 鏈表中的環入口節點{ // pHead為第一個節點 private ListNode entryNodeOfCycle(ListNode pHead)
返回單鏈表中第k個節點(leet簡單篇八百七十六題)
給定一個帶有頭結點 head 的非空單鏈表,返回連結串列的中間結點。 如果有兩個中間結點,則返回第二個中間結點。 示例 1: 輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值為 3 。 (測評系統對該結點序列化表述
[LeetCode] Linked List Cycle II 單鏈表中的環之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space?
[LeetCode] Linked List Cycle 單鏈表中的環
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 這道題是快慢指標的經典應用。只需要設兩個指標,一個每次走一步的慢指標和一
[演算法][LeetCode]Linked List Cycle & Linked List Cycle II——單鏈表中的環
題目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 如何判斷一個單鏈表中有環? Li
[CareerCup] 2.6 Linked List Cycle 單鏈表中的環
2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of the loop.DEFINITIONCircular linked list: A (corrupt)
【LeetCode-面試演算法經典-Java實現】【142-Linked List Cycle II(單鏈表中有環II)】
原題 Given a linked list, return the node where the cycle begins. If there is no cycle, retu
【 C 】在單鏈表中插入一個新節點的嘗試(一)
根據《C和指標》中講解連結串列的知識,記錄最終寫一個在單鏈表中插入一個新節點的函式的過程,這個分析過程十分的有趣,準備了兩篇博文,用於記錄這個過程。 連結串列是以結構體和指標為基礎的,所以結構體和指標是需要首先掌握的知識,掌握之後,最後要明白這個問題:結構體的自引用 這時
資料結構和演算法設計專題之---判斷單鏈表中是否有環,環的長度,環的入口節點
題目: 給定一個單鏈表,只給出頭指標head: 1、如何判斷是否存在環? 2、如何知道環的長度? 3、如何找出環的連線點在哪裡? 4、帶環連結串列的長度是多少? 解法: 1、對於問題1,使用追趕的
判斷單鏈表中是否有環(循環鏈表)
創建 代碼實現 分享圖片 post 圖片 sca struct init 技術 有環的定義:鏈表的尾結點指向了鏈表中的某個結點,如下圖所示 判斷是否有環,兩種方法: 方法1:使用p、q兩個指針,p總是向前走,但q每次都從頭開始走,對於每個節點看p走的步數和q是否一樣,如上
從無頭單鏈表中刪除節點
刪除無頭單鏈表: 程式實現很簡單,主要是思路如果打不開的話,就無從下手。 如果是帶有頭節點的連結串列,直接從頭部遍歷,找到需要刪除的節點,然後直接刪除 刪除的方式,加入目前的節點為node ,前一個節點即為pre pre->next = node->next;
朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1)
朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2) 構建一個簡單的單鏈表 目標:構建一個連結串列,然後將一些資料(譬如1,2,3三個數字)儲存在連結串列中,
9106:查詢單鏈表中的值
Problem Description 從非空單鏈表中查詢其值在[s,t]之間(含s和t)的所有元素,要求輸出值在[s,t]之間的元素個數。 Input 輸入的第一行為一個數字n,表示下面有n組資料,每組資料包括3行:第1行包含兩個數字s和t,第2行為單鏈表的
快慢指標判斷單鏈表中是否有環
快慢指標中的快慢指的是移動的步長,即每次向前移動速度的快慢。例如可以讓快指標每次沿連結串列向前移動2,慢指標每次向前移動1次。判斷單鏈表是否為迴圈連結串列:讓快慢指標從連結串列頭開始遍歷,快指標向前移動兩個位置,慢指標向前移動一個位置;如果快指標到達NULL,說明連結串列以NULL為結尾,不是迴圈連結串列。如
關於連結串列的面試問題(判斷一個單鏈表中是否有環)
判斷一個單鏈表中是否有環 首先連結串列結點宣告如下: struct ListNode { int key; ListNode * next; }; 思路:如果一個單鏈表中有環,用一個指標去遍歷,永遠不會結束,所以可以用兩個指標,一個指標一次走一步,另
連結串列--如何查詢單鏈表中倒數第k個元素
如何查詢單鏈表中倒數第k個元素 思路:因為是單鏈表,只能從頭至尾遍歷。可以設定兩個引用,其中一個引用比另外一個先前移k-1步,然後兩個引用同時開始移動,當先前移的那個引用到達連結串列尾的時候,即指向為
刪除單鏈表中的重複節點(刪除多餘項)
題目:如何刪除單鏈表中的重複節點(即保證每個元素只出現一次,刪除多餘的,且後來出現的元素)。 一個沒有排序的單鏈表,如 list = {a, 1, x, b, e, f, f, e, a, g, h, b, m},請去掉重複項,並保留原順序,以上鍊表去掉重複項
在單鏈表中刪除倒數第k個節點(java實現)
實現方式很多,在這裡只說兩種實現方式。看不懂時候,大家可以畫畫圖,對理解為什麼很有幫助。 第一種方式: 1.首先判斷K值和連結串列是否為空,如果k<=0,或連結串列為空,直接返回head; 2.滿足上面條件後,定義ListNode P=head,重頭
判斷單鏈表中是否存在迴環
判斷單鏈表是否存在迴環原理很簡單,即假設有兩個指標p1,p2。在每次迴圈的時候,p1先走一步,p2走兩步,直到p2碰到空指標或兩者相等時迴圈結束,如果兩個指標相等則說明存在迴環。 具體程式碼如下:(僅供參考) #include <iostream> using