求出有環鏈表的起點(快慢指標)

2021-09-02 08:06:33 字數 938 閱讀 2955

1. 問題描述: 

給定乙個有環的鍊錶,實現乙個演算法返回環路的開頭節點

有環鏈表的定義:在鍊錶中某個節點的next元素指向在它前面出現過的節點,則表明該鍊錶存在環路

要求:不能夠使用額外的空間來進行記錄

2. 題目與之前不一樣的是不能夠開闢額外的空間來進行記錄,所以我們是不能夠使用hashset來判斷哪個節點存在著重複,只能通過另外的方法來進行求解

這裡使用到的又是乙個非常經典的做法,定義兩個指標,快指標和慢指標

假設慢指標s走k步到了有環的節點,因為快指標f每次走兩步,所以與有環節點的距離為k,那麼這個時候應該是f追s,有環節點的長度為l,所以s,f另外之間的距離為l - k,所以f要走多l - k的距離就可以追上s,與s相遇,由於每走一步s與f的距離就會減少1,所以當s走l - k步的時候那麼兩者就相遇了,這個時候相遇的點是關鍵,明顯可以看出相遇的點與有環的點相距k的距離

而頭結點到有環節點的距離也是k,那麼只要s與頭結點同時以同樣的速度移動那麼當他們相遇的時候該節點就是有環的節點了

我們可以在迴圈中判斷兩個指標是否相等,相等的時候跳出迴圈然後s與頭結點同時以同樣的速度移動那麼當他們相遇的時候該節點就是有環的節點了

3. 具體的**如下:

public class main	}	

public static void main(string args)

private static listnode beginofcircle(listnode node)

listnode p = node;

while(p != s)

//迴圈退出的時候那麼s與p指向的節點就是有環鏈表的起點

return p;

}}

找出有環鏈表中環的起點

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...

環鏈找起點(快慢指標)

問題描述如下 給定乙個有環的鍊錶,求開始進入環的那個結點,即下圖的 target 分析 這個問題可以使用快慢指標來巧妙解決,快指標 fast 每次移動兩個結點,慢指標 slow 每次移動乙個結點。當 slow 和 fast 相遇的時候,slow target head target k 即慢指標和頭...

有環鏈表的環起點

用兩個指標,乙個快指標一次走兩步,乙個慢指標一次走一步。快慢指標可以重合表示鍊錶有環,此時距離環起點的距離和起點距離環起點的距離相等。include bits stdc h using namespace std struct list list beginofcircle list p1,list...