用快慢指針求單鏈表的環的第一個節點

//求單鏈表的環的第一個節點,用快慢指針作
public static Node getFirstNodeInCycle(Node head){
    Node slow = head;
    Node fast = head;
    
    // 1 找到快慢指針相遇點
    while(fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next;
        if(slow == fast){
            break;
        }
    }
    
    //錯誤檢查,這是沒有環的狀況
    if(fast == null || fast.next == null){
        return null;
    }
    
    //2 如今,相遇點離環的開始處的距離等於鏈表頭到環開始處的距離,
    //這樣,咱們把快慢指針放在鏈表頭,快指針保持在相遇點,而後同速度前進,再次相遇點,
    //而後同速度前進,再次相遇點就是環的開始處。
    slow = head;
    while (slow != fast){
        slow = slow.next;
        fast = fast.next;
    }
    return fast;
}
相關文章
相關標籤/搜索