判斷連結串列是否有環並求出環的起點
判斷連結串列有無環的方法:
設定一個快指標速度 != 慢指標的速度,這就是物理裡的相遇問題,我開始犯了一個錯,我設定快指標和慢指標的速度相等,所以答案出錯,原因是速度相等,那麼它們在座標軸上的速度永遠是平行的,除非陣列的長度很小,可以相遇一次,否則不能相遇。
如果快指標和慢指標相遇則有環。
求環的起點:當兩指標相遇的時候,將快指標指向連結串列起點,並且速度設定為和慢指標速度相等,當兩指標相遇的時候,此節點則是環的起點。
所以設定快指標速度為2,慢指標速度為1,只要不相等就可以,然後考慮邊界問題,一般都是節點不為空。
下面是求解環的起點程式碼:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null)return null;
ListNode node = head.next.next;//快指標
ListNode p = head;
head = head.next;//慢指標
while(node != null && node.next != null){
if(node == head){//判斷快指標和慢指標是否相遇,如果兩者指向同一個節點,則是有環,接下來快指標指向連結串列頭結點,速度和慢指標相同
while(p != node){//如果兩個指標相同,則返回環的起點。
p = p.next;
node = node.next;
}
return p;
}
head = head.next;
node = node.next.next;
}
return null;
}
}