首先,判断一个单链表是否有环。网上有很多解法就是设置两个指针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

判断链表是否有环及环入口点的求法相关推荐

  1. 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...

    题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少?   解法: 1.对于问题1,使用追赶的方法 ...

  2. 判断单链表是否有环及环的链接点(转)

    这篇文章是转载自蒙恩的罪人的博文:判断单链表是否有环及环的链接点(转),博文网址:http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html 给定一个单链 ...

  3. 判断单链表是否有环以及环的连接点

    给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...

  4. 【刷算法】判断链表是否有环以及返回入环节点

    题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...

  5. 判断单链表是否存在环及环的入口点

    问题1:如何判断单链表中是否存在环(即上图中从结点E到结点R组成的环)? 解答: 设一快一慢两个指针(实际上是两个迭代器,Node *fast, *low)同时从链表起点开始遍历,其中快指针每次移动长 ...

  6. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

  7. 判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)

    PSListNode HasCycle(PSListNode pHead) {if ((NULL == pHead) || (NULL == pHead->pNextNode)){return ...

  8. 判断链表是否存在环(及其延伸)

    有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环. 问题: 1.如何判断一个链表是不是这类链表? 2.如果链表为存在环,如果找到环的入口点 ...

  9. 如何判断链表有环、如何判断两个链表相交

    如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...

最新文章

  1. SpringSecurity-eclipse
  2. 【Linux 内核 内存管理】优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )
  3. 官宣!中央广播电视总台《2021年春节联欢晚会》总导演组公布
  4. php 数组转为json,php怎么将数组数组转化为json格式的数据 ?
  5. fastjson转list嵌套_FastJson的学习之JSON互相转Map集合,List集合,JavaBean
  6. FPGA的PLL锁相环
  7. java过时_Java 语言的几个缺陷之四: 过时的 JavaBean
  8. 用IE和Google 浏览器的比较。。
  9. ~~堆优化版dijkstra
  10. Linux中使用sftp的常用命令
  11. 2020 年软件开发趋势预测!
  12. vue 自定义键盘组件_vue 自定义 数字键盘+mint UI MessageBox的应用
  13. Oracle 官方文档地址
  14. nginx location配置直接输出文本
  15. 谈谈JProfiler的实现原理
  16. 教你webm格式怎么转换成mp4
  17. 蚂蚁金服java研发面经_蚂蚁金服Java研发岗实习内推面经
  18. 语音通知事件提醒功能实现流程
  19. 6.网络安全渗透测试—[信息收集篇6]—[Email信息收集]
  20. lumen 项目根目录_Lumen简单使用

热门文章

  1. OLTP与OLAP理解
  2. 网站建设规划 如何做网站
  3. FBX SDK动画开发
  4. 实现iframe嵌套bilibili视频
  5. 商品房买卖抵押贷款中的保险
  6. BurpSuit在不同浏览器中配置代理
  7. RC微分电路、积分电路和低通滤波电路LPF
  8. linux查看用户名
  9. Try2Hack 过关技巧和密码
  10. 【SWT】创建自己的SWT组件