[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;
    }

 

posted @ 2018-02-09 13:17  stAr_1  阅读(359)  评论(0编辑  收藏  举报