找出有環單鏈表的入口節點

2021-08-27 11:37:30 字數 984 閱讀 4702

這個題比較經典 ,使用兩個指標去解決。乙個快指標,乙個慢指標。快指標每次走兩步,慢指標每次走一步。如果兩個指標相遇,那麼這個鍊錶是有環的。但是關鍵問題是鍊錶環的入口節點在**呢?

數學證明貼上來:設定整個鍊錶的節點個數為n,環的節點個數為l,從煉表頭節點到環的入口節點距離為m,下文記作m節點。

假設慢指標走了k步之後兩個節點相遇,將相遇的節點記作k節點。可以證明 0<=k<=n,(慢指標入環的時候,相對於快指標處於靜止,快指標相對於慢指標的速度為1,所以快指標最壞情況下用l-1的步數就可以追上慢指標),而快指標走了2*k的步數。

可以得知2*k-k=x*l(1) 這一點很好理解,從快指標第一次到達k節點,到後來快指標與慢指標相遇在k節點,中間的過程就是一直在環中繞圈,x為快指標在和慢指標相遇之前繞圈的次數。x是乙個整數。可以得到k=x*l  ,推理出k是l的整數倍。ps:特別注意k代表的是慢指標與快指標第一次相遇走的步數  而k節點只是乙個名稱。而m是煉表頭節點到環的入口節點的步數

提出第二個問題  那麼此時 k節點與環的入口m節點有幾步的距離呢?

最後貼上**便於理解

/*** definition for singly-linked list.

* class listnode

* }*/

public class solution

if(slow==null||fast==null||fast.next==null) return null;

//如果找到了相遇的點 假設slow指標走了 k步  那麼 slow指標指向的節點 就是我們的 k 節點 

listnode first=head; //這就是我們的 j 節點

while(first!=slow)

return first;}}

找出有環鏈表中環的起始節點

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

找出有環鏈表中環的起點

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

如何找出有環鏈表的入環點?

1 head到環入口的距離a過長,導致fast節點很早就進入環中了,a還沒進入環中,此時情況 fast節點走了n圈後,a才開始進入到環中,此時n 1圈 2 head節點開始就是環,或者head到環入口的距離a很短,a進入環中了,b還沒走完一圈,此時n 1圈 從上面的分析知道,當fast和slow相遇...