1. 程式人生 > >單鏈表中查詢環的開始節點

單鏈表中查詢環的開始節點

已知壹個連結串列,尾節點錯誤的指向了本身,形成了帶一段單鏈表的環連結串列;頭結點已知,連結串列長度未知,求節點環的開始節點

/* (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