链表中环的入口结点

链表中环的入口结点

一个链表中包含环,请找出该链表的环的入口结点。
对于找相遇点的问题,“快慢”指针是一个很好的突破口,在这个问题描述中如果我们知道环中结点的个数n:便很好的可以利用”快慢“的性质,如定义P1,P2两个指针,P2先移动n个结点,然后P1,P2一起移动,则相遇的结点就是我们所求的入口结点。(P2移动的结点数-P1移动的结点数=n)

  • 环中个数的求解:

同理采用“快慢”指针的思想,定义指针P1,P2,假设P2的移动速度是P1的两倍,因为链表中存在环,所以P1和P2肯定在环中相遇,记录该结点,动态维护一个移动值i,P1继续移动到该结点时,移动值i为该环的个数

  • 具体AC代码如下:
 public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode p1=pHead;
        ListNode p2=pHead;
        int n=getNodeOfLoop(pHead);
        if(n==-1)
            return null;
        for(int i=0;i<n;i++)
            {
            p1=p1.next;
        }
        while(p1!=p2)
            {
            p1=p1.next;
            p2=p2.next;
        }
        return p1;
    }
    private int getNodeOfLoop(ListNode pHead)//-1表示不存在环;
        {
        if(pHead==null)
            return -1;
        ListNode p1=pHead.next;
        if(p1==null)
          return -1;
        ListNode p2=pHead.next.next;
        while(p1!=null&&p2!=null&&p1!=p2) 
            {
            p1=p1.next;
            p2=p2.next.next;
        } //当P1=P2时跳出循环依次移动获取环中结点个数
        ListNode p3=p2.next;;
        int numOfLoop=1;
        while(p3!=p1)
            {
            p3=p3.next;
            numOfLoop++;
        }
        return numOfLoop;
    }
总结:

其实通过此题可以衍生很多类似的问题,例如如何判断两个链表是否相交,以及如何求出相交的结点等等问题都可以采用”快慢指针”的思想。希望可以通过此题的分析可以帮助读者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值