单链表中环的检测

单链表中环的检测

首先设置两个指针,分别命名为fast和slow,fast指针每次向后移2步,slow指针每次向后移1步。
如果,fast指针最后走到尾结点,则没有环。
如果,fast指针和slow指针相遇,则证明有环。

环的起始结点的查询

当fast与slow相遇之后,
fast指针从头结点开始走,每次走1步
当fast再次与slow相遇以后,相遇处的结点为环的入口结点

证明

推导1:fast指针的步长是否可以>2

这里写图片描述

证明:以第一个链表为例,假设步长为3,当 步长>环的长度 会形成死循环,fast和slow无法相遇,存在环确无法验证码。而,构成环的最少需要两个结点,所以,步长设置为2.

推导2:如何证明fast和slow第二次循环相遇处为环的入口结点

证明:设,环的入口结点到head结点的距离为k,即,第k个结点,fast与slow相遇的结点为k结点之后的a个结点(a>=0),环的长度为x,fast在环中转了 n 圈以后与slow第一次相遇与a。则:

k+a=2×(k+a)-nx;//相遇时的结点
k+a=nx;         //转n圈与k+a相等

此刻,fast回到head结点,步长为1,
当fast结点走到k结点时,slow结点走的路程为,k+a+k=k+nx,nx为在环中循环可忽略,即可发现,第二次相遇位置为 k,即入口结点。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值