链表中环的检测

一、查找是否存在环

1. 定义两个快慢指针 pFast 和 pSlow,pFast 每次走两步,pSlow 每次走一步。

    如果 pFast 在循环遍历后为 null,则链表中不存在环。

    如果 pFast 和 pSlow 相遇则链表中存在环。

2. 为什么 pFast 和 pSlow 会相遇呢?

    假设存在环,那么 快指针与慢指针 终究会进入同一个环中,那么必定会形成下面三种情况之一:

(1) 快指针与慢指针之间差一步,此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇;
(2) 快指针与慢指针之间差两步,此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况;
(3) 快指针与慢指针之间差 N 步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差 (N + 1 - 2) -> N - 1 步,最后总会转化为情况一。

    所以快指针必然与慢指针相遇。又因为快指针速度是慢指针的两倍,所以相遇时必然只绕了一圈。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值