[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;
    }
相关文章
相关标签/搜索