剑指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是报异常的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章