求有环单链表的环长、环起点

通过双指针法求解有环单链表的环长和起点:1. l每次走一步,f每次走两步,相遇在环内;2. 相遇时f比l多走n圈,l走的长度等于n圈环长减去x,x为环外路径长度;3. f回溯到头,l和f同步移动,再次相遇点即环的起点;4. 利用首次相遇和第二次相遇确定环的长度。
摘要由CSDN通过智能技术生成

求有环单链表的环长、环起点

public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(pHead==null||pHead.next==null)    return null;
        ListNode l=pHead,f=pHead;
        while(f!=null&&f.next!=null){
            //1.判断是否有环
            l=l.next;
            f=f.next.next;
            if(l==f){
                f=pHead;
                while(l!=f){
                    l=l.next;
                    f=f.next;
                }
                return f;
            }
        }
        return null;
    }

1.lf从头开始扫描链表。l每次走一步,f每次走两步。如果有环,lf会相遇。

2.在环上相遇时,f会比l多走n圈,f走的长度是l的两倍。(如果LenA<R,f会比l多走1圈,理解起来容易一点)

img

l走的长度 S = LenA + x

f走的长度 2S = LenA + n*R + x

所以可以知道,LenA + x = n*R,  LenA = n*R -x;

因此,相遇时让f回到Head,然后lf每次走一步,相遇点就是环的起点。

3.求环长可以设一个n,第一次相遇时f不动,l每走一步n+1,再相遇时n就是环长。

参考:https://www.cnblogs.com/xudong-bupt/p/3667729.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值