演算法:連結串列判斷是否有環,並且給出環的位置
阿新 • • 發佈:2020-10-12
問題:連結串列
連結串列結構,判斷是否有環
解決方法:快慢雙指標
經典的雙指標方法,一個指標每次向後移動兩個節點,一個指標每次向後移動一個節點,如果連結串列有環,最終兩個指標會碰到一起,
主要問題:有環連結串列,能找出環的切入口節點嗎?
也是利用快慢雙指標,不過技巧在於,第一次相遇後,如果從頭節點再來一個慢指標,兩個慢指標相遇的節點就是入口節點,有點抽象,我們來形象描述一下,如下圖:
這是第一次相遇的時候,我們根據快慢指標可以得到公式:
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=L−m
這裡可以看到 k = L − m k=L-m k=L−m,此時相遇點到入口節點的距離正好等於頭節點到環的入口的距離,所以此時從頭節點安排一個慢指標出發,兩個慢指標肯定能相遇,而且相遇的節點就是在環的入口。