1. 程式人生 > 實用技巧 >演算法:連結串列判斷是否有環,並且給出環的位置

演算法:連結串列判斷是否有環,並且給出環的位置

問題:連結串列

連結串列結構,判斷是否有環

解決方法:快慢雙指標

經典的雙指標方法,一個指標每次向後移動兩個節點,一個指標每次向後移動一個節點,如果連結串列有環,最終兩個指標會碰到一起,

主要問題:有環連結串列,能找出環的切入口節點嗎?

也是利用快慢雙指標,不過技巧在於,第一次相遇後,如果從頭節點再來一個慢指標,兩個慢指標相遇的節點就是入口節點,有點抽象,我們來形象描述一下,如下圖:
在這裡插入圖片描述

這是第一次相遇的時候,我們根據快慢指標可以得到公式:
2 ∗ ( k + m ) = k + L + m 2 k + 2 m = k + L + m k = L − m \begin{aligned} 2*(k+m)&=k+L+m \\ 2k+2m&=k+L+m \\ k&=L-m \end{aligned}

2(k+m)2k+2mk=k+L+m=k+L+m=Lm

這裡可以看到 k = L − m k=L-m k=Lm,此時相遇點到入口節點的距離正好等於頭節點到環的入口的距離,所以此時從頭節點安排一個慢指標出發,兩個慢指標肯定能相遇,而且相遇的節點就是在環的入口。