程序媛詹妮弗
终身学习

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

 

题意:

给定一个链表,判断是否循环

 

思路:

快慢指针

若有环,则快慢指针一定会在某个节点相遇(此处省略证明)

 

代码:

 1 public class Solution {
 2     public boolean hasCycle(ListNode head) {
 3         ListNode fast = head;
 4         ListNode slow = head;
 5         while(fast != null && fast.next != null){
 6             fast = fast.next.next;
 7             slow = slow.next;
 8             if(fast == slow) return true;
 9         }
10         return false;
11     }
12 }

 

二刷

思路


 

If there is no cycle, the fast pointer will stop at the end of the linked list.

If there is a cycle, the fast pointer will eventually meet with the slow pointer.

For each iteration, the fast pointer will move one extra step. If the length of the cycle is M, after M iterations, the fast pointer will definitely move one more cycle and catch up with the slow pointer.

public class Solution {
    public boolean hasCycle(ListNode head) {
        // corner case 
        if(head == null) return false;
        
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next!= null){  /*此处遗漏了fast!=null导致报错*/
            fast = fast.next.next;
            slow = slow.next;
            if(slow == fast){
                return true;
            }
        }
        return false;    
    }
}

这个test case表明了fast在为null的时候,就禁止进入while循环内部了,否则会导致fast.next.next没有指向。

 

posted on 2018-06-26 06:48  程序媛詹妮弗  阅读(174)  评论(0编辑  收藏  举报