【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现

【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

链表带环问题是数据结构中的经典考点,核心在于通过快慢指针法判断环的存在并定位入口点。本文从 LeetCode 两道真题出发,拆解快慢指针的相遇逻辑与数学推导,结合代码实现与严谨证明,清晰呈现带环链表的解题思路,帮助读者深入理解指针策略在链表问题中的灵活运用。

一、带环链表

1.1题目

链接:带环链表

在这里插入图片描述
注:这道题我们依旧使用高阶要求来做题

1.2 算法原理

核心思想:快慢指针 --- 相遇即为链表带环

创建两个指针 — slow和fast初始指向head,遍历链表slow每次走一步,fast每次走两步,那么就会分成两种情况:
• 链表不带环:那么fast一定可以遍历到NULL,
•链表带环:fast一定比slow先走进循环,在环内不断循环,当slow也进入循环时,如果链表带坏则与fast必定能相。

1.3 代码

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;*};*/ typedef struct ListNode* ListNode; bool hasCycle(struct ListNode *head){ ListNode slow = head; ListNode fast = head;//如果不相遇分为奇数个和偶数个 while(fast && fast->next){ slow = slow->next; fast = fast->next->next;//链表相遇 if(fast == slow)returntrue;}//能跳出循环 --- 不带环 returnfalse;}

1.4 数学证明

1.4.1 为什么带环slow与fast必定能相遇?

在这里插入图片描述

假设slow进环时与fast的差距为N,那么接下来就是追击问题,slow每次走一步,fast每次走两步。那么每走完一次slow的距离就会变成:N - 1,N - 2,N -3…2,1,0,故必定会相遇

1.4.2 fast一定只能走2步吗?可以是2步甚至更多吗?

1.4.2.1 以3步为例
在这里插入图片描述


假设slow进环时与fast的差距为N,那么接下来就是追击问题,slow每次走一步,fast每次走三步。会分成两种情况:
•当N是偶数时:N - 2,N - 4,N - 6…4,2,0
•当N是奇数时:N - 2,N - 4,N - 6…3,1,-1

在这里插入图片描述

也就是当N是偶数时,必定会相遇,当N是奇数时最后距离为-1,也就是会错过,如果假设圆环周长为C,那么当 N 是奇数时且fast与slow错过后进入新一轮追击,距离变为C-1,那么又会变成两个的情况:
•当N = C -1是偶数时(C为奇数):N - 2,N - 4…4,2,0
•当N = C - 1是奇数时(C为偶数):N - 2,N - 4…3,1,-1
综上我们可以分析出要让slow和fast不相遇只有一种可能:C为偶数且第一轮追击中N为奇数同时成立。
C为偶数且第一轮追击中N为奇数能同时满足吗?
那我们还是假设当slow进环时,slow与fast相距N:
slow走过的距离:L。
fast走过的距离为:L + C * x(x:为绕环圈数) + C - N。
slow与fast始终满足:slow = 2 * fast。
联立上面三个式子可得:2L = (x+ 1) * C - N ,我们分析可得该等式为:偶数 = (x + 1) 偶数 - 奇数不成立,故两个条件无法同时成立 ,故不会永远追不上,slow和fast必定相遇,

1.4.3结论

• 链表带环,使用快慢指针,无论fast走几步,都必定在环内与slow相遇。

二、环形链表(寻找相遇点)

2.1 题目

链接:环形链表(寻找相遇点)

在这里插入图片描述

2.2 算法原理

2.3 代码

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;*};*/ typedef struct ListNode* ListNode; struct ListNode *detectCycle(struct ListNode *head){ ListNode slow = head; ListNode fast = head;while(fast && fast->next){ slow = slow->next; fast = fast->next->next;if(slow == fast){ ListNode meet = slow;while(meet != head){ meet = meet->next; head = head->next;}return meet;}}returnNULL;}

2.4 数学证明

在这里插入图片描述


H 为链表的起始点,E 为环入口点,M 与判环时候相遇点
设:环的长度为 R,H 到 E 的距离为 L, E 到 M 的距离为 X则: M 到 E 的距离为 R - X。在判环时,快慢指针相遇时所走的路径长度:
fast: L + X + nR
slow: L + X

注意:
当慢指针进入环时,快指针可能已经在环中绕了 n 圈了,n 至少为 1因为:快指针先进环走到 M 的位置,最后又在 M 的位置与慢指针相遇
慢指针进环之后,快指针肯定会在慢指针走一圈之内追上慢指针。
因为:慢指针进环后,快慢指针之间的距离最多就是环的长度,而两个指针在移动时,每次它们之间的距离都缩减一步,因此在慢指针移动一圈之前快指针肯定是可以追上慢指针的。
在这里插入图片描述


极端情况下,假设 n = 1,此时:L=R−X即:一个指针从链表起始位置运行,一个指针从相遇点位置绕环,每次都走一步,两个指针最终会在入口点的位置相遇

2.4.1 结论

• 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

总结与每日励志

✨本文系统梳理了带环链表的判环与入口定位方法,核心在于利用快慢指针的速度差实现相遇,再通过双指针同步遍历定位入口。每一次逻辑推导都是思维的锤炼,每一行代码都是能力的沉淀。愿你在技术之路上保持热爱与专注,以严谨态度攻克难题,永远相信美好的事情即将发生,用坚持书写属于自己的精彩。

在这里插入图片描述

Read more

Java常见面试题及答案汇总(2025最新版)

一、Java基础语法与核心特性 1. Java的核心特性有哪些? 答案: * 跨平台性(Write Once, Run Anywhere):通过JVM(Java虚拟机)实现,字节码文件可在任意支持JVM的操作系统运行; * 面向对象(OOP):封装、继承、多态三大核心特性; * 安全性:支持沙箱机制、字节码校验、权限控制(如文件IO权限); * 健壮性:自动垃圾回收(GC)避免内存泄漏,强类型检查、异常处理机制减少运行时错误; * 分布式:支持RMI(远程方法调用)、HTTP协议,便于开发分布式应用; * 多线程:内置多线程API,支持并发编程。 2. 基本数据类型与包装类的区别? 答案: 维度基本数据类型(如int、float)包装类(如Integer、Float)本质原始值,无对象属性引用类型,继承Object类默认值有(

By Ne0inhk
【Java 开发日记】我们来说一下 MySQL 的慢查询日志

【Java 开发日记】我们来说一下 MySQL 的慢查询日志

目录 一、什么是慢查询日志 二、核心作用 三、配置参数详解 四、开启和配置 1. 临时开启(重启失效) 2. 永久开启(修改配置文件) 五、慢查询日志格式分析 典型日志条目: 关键字段解释: 六、慢查询分析工具 1. mysqldumpslow(MySQL 自带) 2. pt-query-digest(Percona Toolkit) 3. mysqlslow(第三方工具) 七、慢查询日志表模式 启用表模式存储: 表结构: 八、最佳实践和优化建议 1. 阈值设置建议 2. 日志轮转配置 3. 定期分析计划 九、性能监控和告警 1. 监控慢查询数量 2. 慢查询告警脚本

By Ne0inhk
Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路

Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 前言 * 误区一:过度依赖框架,忽视底层原理 * 1.1 误区表现 * 1.2 问题诊断流程 * 1.3 正确做法:从零构建理解 * ❌ 错误示范:直接使用框架 * ✅ 正确示范:先理解底层,再用框架 * 1.4 学习路径对比 * 误区二:忽视Java特性,照搬Python方案 * 2.1 误区表现 * 2.2 常见错误对比 * 2.3 典型错误案例 * ❌ 错误1:字符串拼接JSON * ✅ 正确1:使用Java类型系统 * ❌ 错误2:同步阻塞调用 * ✅ 正确2:使用Java响应式编程 * 2.4

By Ne0inhk
2026年AI学习完整指南:从入门到进阶的12个月通关路线图

2026年AI学习完整指南:从入门到进阶的12个月通关路线图

2026年AI学习完整指南:从入门到进阶的12个月通关路线图 引言:站在AI技术爆发的关键节点 人工智能领域正经历前所未有的技术变革。2025年,多模态大模型实现了从"拼接式融合"到"原生融合"的跨越式发展,类脑计算与具身智能从实验室走向产业落地,而轻量化微调技术的成熟让大模型定制化的门槛大幅降低。对于想要进入AI领域的从业者和学习者而言,这既是最好的时代,也是最具挑战的时代——技术迭代速度加快,学习路径愈发清晰却也更加细分。 本文基于2025年AI领域的核心突破,为你梳理出一套完整的12个月学习路径。这套路径按照"基础→框架→项目→工程化"四个阶段递进设计,每周任务明确、工具资源齐全、实战项目可落地。无论你是零基础的新手,还是希望进阶的技术从业者,都能在这份指南中找到适合自己的学习节奏。关键在于,这不仅仅是一份知识清单,更是一份可以直接照做的行动手册——每周学什么、练什么、用什么数据、做什么项目,都已经为你规划完毕。 一、2025年AI关键技术突破全景 1.1

By Ne0inhk