快慢指針用來判斷循環鏈表 記住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; }