快慢指针与带环链表


在这里插入图片描述

1.什么是快慢指针

快慢指针是一种常用的指针技巧,常用于解决链表相关问题。

快指针(fast pointer)和慢指针(slow pointer)同时从起点出发,但步长不同。快指针每次移动两个节点,慢指针每次移动一个节点。通过不同的移动速度,可以实现对链表的不同遍历方式。

快慢指针常见的应用场景有三种:

  1. 判断链表是否有环:
    快指针每次移动两个节点,慢指针每次移动一个节点。如果链表没有环,快指针最终会到达链表的末尾,而慢指针会到达中间位置。如果链表有环,快指针和慢指针最终会相遇。

  2. 寻找链表的中间节点:
    快指针每次移动两个节点,慢指针每次移动一个节点。当快指针到达链表末尾时,慢指针正好到达链表的中间位置。

  3. 判断链表的长度是否满足某个条件:
    快指针和慢指针同时从链表头部出发,根据条件不同,快指针可能在达到链表尾部之前到达某个位置,然后可以根据快指针和慢指针的位置判断链表长度是否满足条件。

2.判断链表是否带环

在这里插入图片描述
演示动画
请添加图片描述

参考演示代码:

在这里插入图片描述
slow指针和fast指针进入链表的环状部分时,假设slowfast相距Nfast每次比slow多走一步,因此此问题便转变为数学的追及问题。
在这里插入图片描述
然而当fast指针一次走三步,四步,五步还能否与slow相遇?
以三步为例不难发现如果N是偶数,只要次数够多N-2终究会变成0,因此fast还是会与slow相遇,但当N为基数时,N-2=-1说明fast超过slow一步准备开始第二轮追击,假设圆的周长为C,当C-1为偶数时,fast最终还是会和slow相遇。因此得出结论当N为基数且C为偶数时不可能相遇。
在这里插入图片描述

数学分析

这可能并不严谨,因此我们需要从数学的角度深刻探究此问题。

  • 假设slow指针走的路程是:L

  • 环状带比较小时,在slow指针还未进入环状带fast指针可能已经在环状带走动了好几圈,我们假设圈数为:X

  • 当slow指针准备进入环状带时fast比slow多走:C-N
    在这里插入图片描述

  • 因此fast指针走的路程为:L+X*C+C-N

  • 而fast指针的速度是slow指针的三倍

  • 得出等式:L+X*C+C-N=3L

  • 化简:2L=(X-1)*C-N

  • 得出结论CN不可能一基一偶

所以当fast指针一次走三步也终将和slow相遇(你认为她不属于你,但可能只是时候未到)

3.返回链表开始入环的第一个节点

在这里插入图片描述
在这里插入图片描述

  • slow的路程:L+N
  • fast的路程:L+N+X(圈数)*C
  • fast是slow速度的两倍
  • 化简:L=X*C-N
    在这里插入图片描述
    因此让slow从meet的位置开始走,让head从起点开始走当他们相遇时的交点就是开始入环的第一个节点。
    参考代码
    在这里插入图片描述
    有什么建议评论区留言偶。
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值