鍊錶 怎麼判斷鍊錶有環,怎麼找環節點

2022-08-09 09:27:15 字數 994 閱讀 5750

定義快慢指標fast和slow,fast每次前進兩步,slow每次前進一步;

當fast和slow在到達鏈尾之前相遇的話,就證明有環(類似於在操場上跑步跑的慢的被快的套圈但總會遇到);

fast和slow相遇之後,fast不動,slow回到最初的起點,然後一步一步的等在再次相遇,這時候相遇地點就是環結點

證明如下,是個數學問題。。。

設一環的距離是r,k代表環數

slow走過的距離:ab+bc

fast走過的距離:ab+bc+k*r

因為slow每次一步,fast每次兩步,所以距離有兩倍關係

2(ab+bc)=ab+bc+k*r

ab+bc=(k-1)*r+bc+cb

ab=(k-1)*r+cb

所以結論就是fast從c->b加k圈停在b的時候,slow正好從a->b到達b

1 #include 2

using

namespace

std;

34 typedef struct listnode*list;

5struct

listnode ;910

list judge(list l)

22//

如果到頭也沒有找到證明沒有環

23if (fast->next == null || fast->next->next ==null)

24return

null;

2526

//此時fast記錄相遇點,slow回到頭指標

27 slow =l;

28while (fast !=slow)

32//

再次相遇的結點就是環結點

33return

slow;

34 }

思路參考

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...

如何判斷鍊錶有環

假設存在環,環前共l個節點,環中共c個節點.設乙個慢指標起始位置為a,速度為1,快指標起始位置為b,速度為2.t時間後,二者相遇,可列方程 a t l mod c b 2 t l mod c 即t a b mod c 該模線性方程必定有解.所以無論a,b的起始位置如何,二者總是會相遇的.struct...

判斷鍊錶是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...