[LeetCode]141. Linked List Cycle判断循环链表
快慢指针用来判断循环链表 记住
快慢指针有四种常用的应用场景:
1.找到有序链表的中点,快指针到头的时候,慢指针就是中点。
2.判断是不是循环链表,快慢指针相遇就是
3.找到循环链表的起点,以链表头结点开始的结点和以快慢指针相遇结点为开始的结点,这两个结点相遇的地方就是开始
4.判断两个链表是不是相交。将其中一个链表收尾相接,然后判断另外一个链表是不是循环链表。
有个博客写的很好:
http://blog.csdn.net/willduan1/article/details/50938210
看见循环链表就向快慢指针,就向看见BST就想中序遍历一样
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; }