[LeetCode]141. Linked List Cycle判斷循環鏈表

快慢指針用來判斷循環鏈表  記住spa

快慢指針有四種經常使用的應用場景:.net

1.找到有序鏈表的中點,快指針到頭的時候,慢指針就是中點。指針

2.判斷是否是循環鏈表,快慢指針相遇就是code

3.找到循環鏈表的起點,以鏈表頭結點開始的結點和以快慢指針相遇結點爲開始的結點,這兩個結點相遇的地方就是開始blog

4.判斷兩個鏈表是否是相交。將其中一個鏈表收尾相接,而後判斷另一個鏈表是否是循環鏈表。博客

 

 

有個博客寫的很好:ast

http://blog.csdn.net/willduan1/article/details/50938210class

看見循環鏈表就向快慢指針,就向看見BST就想中序遍歷同樣List

public boolean hasCycle(ListNode head) {
        /*
        看的答案,快慢指針,若是一個鏈表是循環鏈表,那麼快慢指針必定會相遇
        由於快指針確定會套慢指針一圈,就跟跑步套圈同樣
         */
        if (head==null) return false;
        ListNode slow = head;
        ListNode fast  = head;
        while (fast!=null&&fast.next!=null)
        {
            slow = slow.next;
            fast = fast.next.next;
            if (fast==slow) return true;
        }
        return false;
    }

 第二題是找到循環鏈表的開始循環

public ListNode detectCycle(ListNode head){
        /*
        快慢指針的一個應用,找到鏈表的循環開始的節點
        方法是:一個節點的從鏈表開頭開始,一個節點從快慢節點的相遇點開始,一塊兒走,每次一步,相遇的地方是就是循環的開始
         */
        if (head==null||head.next==null) return null;
        //快慢指針找到相遇的地方
        ListNode slow = head;
        ListNode fast  = head;
        while (fast!=null&&fast.next!=null)
        {
            slow = slow.next;
            fast = fast.next.next;
            if (fast==slow) break;
        }
        //若是fast或者fast的next是null,說明沒有環
        if (fast==null||fast.next==null) return null;
        slow = head;
        while (fast!=slow)
        {
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
相關文章
相關標籤/搜索