劍指offer刷題總結——鏈表篇(二)

1.鏈表中環的入口結點

【題目】

鏈表中環的入口結點給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出 null。

【代碼】

package swear2offer.linkednode;

public class Loop {

    /**
     * 給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出 null。
     *
     * 思路:
     * 快慢指針,快指針一次走兩個,慢指針一次走一個,
     * 二者最開始從起點走,然後在A點相遇,A點是在環內
     * 然後讓其中一個指針從起點重新出發,另一個在A點出發
     * 二者每次都是走一步,二者再次相遇的地點就是環的入口點
     *
     * 特殊情況:
     * 起點就是入口節點
     * 沒有環的情況
     * 注意:漏掉了節點只有一個元素的情況,此時head.next.next是報異常的
     * */
    public ListNode EntryNodeOfLoop(ListNode pHead) {

        if (pHead == null) return null;
        if (pHead.next == null) return null;

        ListNode slow,fast;
        slow = fast = pHead;

        slow = slow.next;
        fast = fast.next.next;

        while (slow != fast && slow !=null && fast != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 不存在環
        if (slow != fast) return null;

        slow = pHead;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }

        return slow;
    }


}

 * 思路:
 * 快慢指針,快指針一次走兩個,慢指針一次走一個,
 * 二者最開始從起點走,然後在A點相遇,A點是在環內
 * 然後讓其中一個指針從起點重新出發,另一個在A點出發
 * 二者每次都是走一步,二者再次相遇的地點就是環的入口點
 *
 * 特殊情況:
 * 起點就是入口節點
 * 沒有環的情況
 * 注意:漏掉了節點只有一個元素的情況,此時head.next.next是報異常的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章