1. 程式人生 > >判斷連結串列是否有環並求出環的起點

判斷連結串列是否有環並求出環的起點

判斷連結串列有無環的方法:

設定一個快指標速度  != 慢指標的速度,這就是物理裡的相遇問題,我開始犯了一個錯,我設定快指標和慢指標的速度相等,所以答案出錯,原因是速度相等,那麼它們在座標軸上的速度永遠是平行的,除非陣列的長度很小,可以相遇一次,否則不能相遇。

如果快指標和慢指標相遇則有環。

求環的起點:當兩指標相遇的時候,將快指標指向連結串列起點,並且速度設定為和慢指標速度相等,當兩指標相遇的時候,此節點則是環的起點。

所以設定快指標速度為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;
    }
}