1. 程式人生 > >演算法-單鏈表及環

演算法-單鏈表及環

演算法-單鏈表及環

 

碰到一個問題,單鏈表及環的問題,整理一下各種解法:

 

1.1.    是否有環

  1. 連結串列唯一標識列表化,遍歷連結串列,判斷表中是否有當前節點唯一標識,有代表有環,無則將當前節點唯一標識加入列表。

時間複雜度最優,空間複雜度較高。

  1. 快慢指標,快指標移動步伐為2,慢指標移動步伐為1,如果兩者相遇,則有環,如快指標為NULL,即到鏈尾,則無環。

 

1.2.    環的長度

  1. 鏈長度-無環長度,換句話說,(列表長度+1)-list.index(當前節點ID)
  2. 在慢指標進入環的時候,快指標到慢指標的距離為n,那麼到二者相遇的時候,一定移動了n次;

現在快慢指標位置重合,再往前移動,移動r次兩者再次相遇,說明快指標追上了慢指標,追的長度等於r等於環的長度。

 

1.3.    環的起點位置

  1. list.index(當前節點ID)
  2. 假設起點到環起點的長度為LenA;開始到第一次相遇,移動了t步;環的長度為R;環的起點到二者第一次相遇位置的距離為x,二者相遇的時候快指標已經在環上轉了n圈。

則有如下等式成立: 慢指標移動的距離=LenA + x; 即 t = LenA + x;

快指標移動的距離=LenA + n * R + x; 即 2t = LenA + n * R + x;

所以 2*(LenA+x) = LenA + n*R + x;

即 LenA = n * R - x;

上面的等式可以這樣理解,如果慢指標從連結串列起點開始移動,快指標從環起點開始移動,當慢指標從起點走到環起點的時候,快指標一直在環上移動,而且還差x步就移動了n圈。進而可以得到結論,如果慢指標從連結串列起點開始移動,快指標從二者第一次相遇點開始移動,當慢指標到達環起點的時候,快指標也正好達到環起點,即二者指向相同的節點。