1. 程式人生 > >判斷單鏈表是否形成環形結構,快慢指標

判斷單鏈表是否形成環形結構,快慢指標

判斷一個單鏈表是否有環,若有,找出環的入口節點
分析:
一個單鏈表有環,必須是連結串列尾部帶環;
這裡寫圖片描述

判斷單鏈表是否有環,利用快慢指標的原理, 設定快慢指標 fast 、 slow 都指向單鏈表的頭節點, 其中 fast 的移動速度是 slow 的2倍。

  • 如果在fast==slow前,fast走到next==null結點,即沒有環;
  • 如果是有環的連結串列的話,當快慢指標(slow、fast)相遇時,slow指標肯定沒有遍歷完連結串列,而fast指標已經在環內迴圈了。

    為什麼會肯定的說,會在slow轉第滿一圈前的時候兩指標必然相遇呢?
    不妨設環長為L,第一個指標P1第一次進入環時,第二個指標P2在P1前方第a個結點處(0 < a < L);
    設經過x次移動後兩個指標相遇,那麼應該有
    0+x = (a + 2x) (mod L);
    x =nL-a。(n=1,2,3….)
    我們取第一次相遇,即n=1;所以有x=L-a.

下面這張圖可以清晰地表明這種關係,
經過x = L-a次移動,P1向前移動了L-a個位置(相當於後退了a),到達P1′處,
而P2向前移動了2L-2a個位置(相當於後退了2a),到達P2′處,P1′和P2′相遇。
所以說,slow(P1) 在走步 x<圈長,後必然與fast相遇。

這裡寫圖片描述

也就是說,當在環裡轉圈時,如果A的速度是B的速度的2倍,A是肯定會追上B的,追上的點,就是開始時B位置 後面- 剛開始時A B距離;在A的第一圈,B的第二圈相遇。