23.链表中环的入口节点

2019-03-15  本文已影响0人  ___Qian___

题目

一个链表中包含环,请找出该链表的环的入口节点。

思路

1.先判断链表中是否包含环 (快慢指针)
node1,node2指向头结点,node1每次向前移动1步,node2每次向前移动2步,若出现node1==node2,则有环,若node2==null,则无环
2.若链表中存在环,寻找环的入口节点
在1基础上,node2保持不动,node1指向头结点,然后node1和node2同时向前移动1步,当node1==node2时,则为环的入口节点(画图容易理解)

public class Solution {
    ListNode EntryNodeOfLoop(ListNode pHead){
        if(pHead == null || pHead.next == null)
            return null;
        ListNode p1 = pHead;
        ListNode p2 = pHead;
        while(p2 != null && p2.next != null ){
           //快慢走
            p1 = p1.next;   
            p2 = p2.next.next;
            if(p1 == p2){      //相遇
                //有环
                p2 = pHead;      //指向链表头结点
                while(p1 != p2){
                    //同时走
                    p1 = p1.next;
                    p2 = p2.next;
                }
                if(p1 == p2)      //相遇
                   //环的入口点
                    return p1;
            }
        }
        return null;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读