演算法-單鏈表及環
阿新 • • 發佈:2018-11-16
演算法-單鏈表及環
碰到一個問題,單鏈表及環的問題,整理一下各種解法:
1.1. 是否有環
- 連結串列唯一標識列表化,遍歷連結串列,判斷表中是否有當前節點唯一標識,有代表有環,無則將當前節點唯一標識加入列表。
時間複雜度最優,空間複雜度較高。
- 快慢指標,快指標移動步伐為2,慢指標移動步伐為1,如果兩者相遇,則有環,如快指標為NULL,即到鏈尾,則無環。
1.2. 環的長度
- 鏈長度-無環長度,換句話說,(列表長度+1)-list.index(當前節點ID)
- 在慢指標進入環的時候,快指標到慢指標的距離為n,那麼到二者相遇的時候,一定移動了n次;
現在快慢指標位置重合,再往前移動,移動r次兩者再次相遇,說明快指標追上了慢指標,追的長度等於r等於環的長度。
1.3. 環的起點位置
- list.index(當前節點ID)
- 假設起點到環起點的長度為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圈。進而可以得到結論,如果慢指標從連結串列起點開始移動,快指標從二者第一次相遇點開始移動,當慢指標到達環起點的時候,快指標也正好達到環起點,即二者指向相同的節點。