当前位置: 首页 > ds >正文

链表有环找入口节点原理

环形链表入口检测算法数学解释

数学原理

  1. 假设定义:

    • 链表头到环入口的距离为 a
    • 环入口到相遇点的距离为 b
    • 相遇点到环入口的距离为 c
    • 环的长度为 b + c
  2. 第一次相遇时:

    • 慢指针走了 s = a + b
    • 快指针走了 f = a + b + n(b + c) 步,其中 n 是快指针在环内转的圈数
    • 由于快指针速度是慢指针的2倍,所以 f = 2s
  3. 代入求解:

    2(a + b) = a + b + n(b + c)
    a + b = n(b + c)
    a = n(b + c) - b
    a = (n-1)(b + c) + c
    
  4. 关键结论:

    • 当 n=1 时,a = c
    • 这意味着:从链表头到环入口的距离 = 从相遇点继续走到环入口的距离

当n不等于1时

您提出了一个很好的问题!我们确实不知道具体的 n 值(快指针绕环的圈数)。让我更清晰地解释:当入口节点很远,可能快指针早就到达环而且转了好几圈了

为什么 n 的具体值不重要

  1. 我们证明了:a = (n-1)(b+c) + c,其中 a 是头到环入口的距离,b+c 是环的周长。

  2. 关键点:无论 n 是多少(1, 2, 3…),等式右边 (n-1)(b+c) + c 都表示:

    • 先在环上走 n-1 个完整的圈(即 (n-1)(b+c))
    • 再从相遇点继续走 c 步
  3. 这意味着:从相遇点走 c 步(可能再加上若干个环的周长)一定会到达环入口。

  4. 同样,从链表头走 a 步也会到达环入口。

  5. 由于 a = (n-1)(b+c) + c,如果同时:

    • 从链表头开始走
    • 从相遇点开始走
    • 都用相同的速度(每次走1步)

    那么这两个指针会同时到达环入口!

  6. 一个放到头节点走到入口节点 另一个从相遇点走到入口节点在转了几个整圈

实际上 n 的值怎么确定

在实际的链表环检测中,n 值由快慢指针首次相遇时决定,但我们不需要计算它:

  • 在标准链表(环不会特别大)中,通常 n=1。
  • 即使 n>1,算法也能正确工作:
    • 快指针在相遇时可能多走了几圈
    • 但在第二阶段,从相遇点出发的指针会沿着相同的路径(可能走几圈)最终到达入口
http://www.xdnf.cn/news/19343.html

相关文章:

  • css绘制三角形
  • A股大盘数据-20250829 分析
  • C++基础(③反转字符串(字符串 + 双指针))
  • 阿里巴巴拍立淘API返回值解析与商品信息优化指南
  • 刷题日记0829
  • Libvio 访问异常排查指南
  • OpenEuler部署LoganaLyzer
  • linux实时性研究
  • Python 编码与加密全解析:从字符编码到 RSA 签名验证
  • Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式
  • 龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!
  • Anaconda安装与conda使用详细版
  • Linux系统编程—进程概念
  • 文本嵌入模型的本质
  • 进程与线程的根本区别
  • Parasoft赋能测试:精准捕捉运行时缺陷
  • 解决RTX3070魔改16G在UBUNTU中黑屏问题
  • AI ToB,阿里商旅找了个好赛道
  • C++ 并发编程:全面解析主流锁管理类
  • Day17_【机器学习—特征预处理(归一化和标准化)】
  • Unity学习----【数据持久化】二进制存储(一)
  • 仿真高斯光束同时分析光纤耦合特点并仿真
  • 大模型入门学习微调实战:基于PyTorch和Hugging Face电影评价情感分析模型微调全流程(附完整代码)手把手教你做
  • Lenovo C225 一体机拆机维修教程
  • 从零开始学Shell编程:从基础到实战案例
  • 【完整源码+数据集+部署教程】骨折检测系统源码和数据集:改进yolo11-EfficientHead
  • flume事务机制详解:保障数据可靠性的核心逻辑
  • Vue3 kkfileview 的使用
  • 第八章 惊喜01 测试筹备会
  • Shell 中 ()、(())、[]、{} 的用法详解