判断链表是否有环及环入口点的求法
首先,判断一个单链表是否有环。网上有很多解法就是设置两个指针fast,slow分别指向链表头部,然后同时向后遍历。fast步长为2即每次走两步,slow每次走一步。如果fast走到链表尾部则肯定没有环,因为如果有环肯定是如下图所示的样子。
如果fast和slow相遇则有环。有没有可能在有环的情况下fast和slow永远不相遇呢?假设在某个时间slow走过的路程为S而且slow已经在环上了,则fast走过的为2S。因为fast是速度是slow的两倍。假设环的长度为L,fast和slow不相遇的条件就是(2S - S) % L != 0永远成立,因为fast和slow相遇即在某一时刻fast比slow多走过了n(n>=1)圈,(2S - S) % L == S % L != 0是不是会永远成立?明显不会,因为S每次增加1,总有一天会等于0成立。
现在假设已经知道了有环,来求环的入口点。
如上图所示,我们先作如下的假设:
链表起点为A点;
环的入口为B点;
fast和slow的相遇点为C;
链表的方向为顺时针;
A到B的距离为X;
B到C的距离为Z;
C到B的距离为Y。
则有如下的结果成立:
1. X + Z = S;
2. X + Z + nL = 2S;
3. Y + Z = L;
即X + Z + nL = 2X + 2Z -> X = nL - Z = nL - (L - Y) = (n - 1)L + Y。最后的结果就是X = (n - 1)L + Y,其中n>=1。也就是说从A和C点同时出发,以步长为1遍历链表,那么在C处出发的指针在多走了n-1圈之后与从A出发的指针在B处相遇。也就是说两个指针指向同一个节点的时候这个点就是环的入口点。
转载于:https://www.cnblogs.com/likeio/p/3593686.html
判断链表是否有环及环入口点的求法相关推荐
- 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...
题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法 ...
- 判断单链表是否有环及环的链接点(转)
这篇文章是转载自蒙恩的罪人的博文:判断单链表是否有环及环的链接点(转),博文网址:http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html 给定一个单链 ...
- 判断单链表是否有环以及环的连接点
给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...
- 【刷算法】判断链表是否有环以及返回入环节点
题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...
- 判断单链表是否存在环及环的入口点
问题1:如何判断单链表中是否存在环(即上图中从结点E到结点R组成的环)? 解答: 设一快一慢两个指针(实际上是两个迭代器,Node *fast, *low)同时从链表起点开始遍历,其中快指针每次移动长 ...
- 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)
接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)
PSListNode HasCycle(PSListNode pHead) {if ((NULL == pHead) || (NULL == pHead->pNextNode)){return ...
- 判断链表是否存在环(及其延伸)
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环. 问题: 1.如何判断一个链表是不是这类链表? 2.如果链表为存在环,如果找到环的入口点 ...
- 如何判断链表有环、如何判断两个链表相交
如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...
最新文章
- SpringSecurity-eclipse
- 【Linux 内核 内存管理】优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )
- 官宣!中央广播电视总台《2021年春节联欢晚会》总导演组公布
- php 数组转为json,php怎么将数组数组转化为json格式的数据 ?
- fastjson转list嵌套_FastJson的学习之JSON互相转Map集合,List集合,JavaBean
- FPGA的PLL锁相环
- java过时_Java 语言的几个缺陷之四: 过时的 JavaBean
- 用IE和Google 浏览器的比较。。
- ~~堆优化版dijkstra
- Linux中使用sftp的常用命令
- 2020 年软件开发趋势预测!
- vue 自定义键盘组件_vue 自定义 数字键盘+mint UI MessageBox的应用
- Oracle 官方文档地址
- nginx location配置直接输出文本
- 谈谈JProfiler的实现原理
- 教你webm格式怎么转换成mp4
- 蚂蚁金服java研发面经_蚂蚁金服Java研发岗实习内推面经
- 语音通知事件提醒功能实现流程
- 6.网络安全渗透测试—[信息收集篇6]—[Email信息收集]
- lumen 项目根目录_Lumen简单使用