所以我最近遇到了算法來確定一個循環是否存在於鏈表中。代碼如下:確定鏈表中是否存在循環的算法
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null) {
if (fast.next == null) {
return false;
}
if (fast.next == slow) {
return true;
}
fast = fast.next.next;
slow = slow.next;
}
return false;
}
當試圖證明該算法的正確性,我想出了一個主意: 假設週期的周長是「一」,前兩個指針相遇是過去的時間「T」。由於「快」節點的速度移動快兩倍的「慢」的節點,我們可以得到的數學關係:
2噸模A = t模一
現在,「一」是一個常量代表周長和「t」可能是1,2,3 ......那麼,我如何證明不管「a」的值是多少,我們總能找到一個「t」,這樣上面的等式是可解的?
http://stackoverflow.com/q/2936213/1835769 – displayName
如果週期不在第一個節點開始,方程是否正確?例如:1→2→2→3→3→4→4→5→5→3,週期= {3,4,5,3} – shole
任何't = 0 mod a'都解決了2t = t mod a'。你還需要't> = s',它需要'''步驟來進入循環。 –