单链表判断环路及环路的入口
来源:互联网 发布:cdn网络加速 书 编辑:程序博客网 时间:2024/06/02 07:39
1. 遍历链表
将已经遍历过的节点放在一个hash表中,如果一个节点已经存在hash表中,说明有环。
时间复杂度:O(n)
空间复杂度:O(n)
2. 快慢指针
时间复杂度:O(n)
空间复杂度:O(1)
使用两个指针
#### 判断环的存在:
设置两个指针fast和slow,初始值都指向头,slow每次前进1步,fast每次前进2步。
链表存在环:则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则是无环链表)。
链表不存在环:fast先行头到尾部为NULL,则是无环链表。
寻找环的入口点:
当fast按照每次2步,slow每次1步的方式走,发现fast和slow重合,确定了单向链表有环路。
接下来,让fast回到链表的头部,重新走,每次步长1,那么当fast和slow再次相遇的时候,就是环路的入口了。
证明:在fast和slow第一次相遇的时候,假定slow走了n步,环路的入口是在p步,那么
slow走的路径: p+c = n; c为fast和slow相交点 距离环路入口的距离
fast走的路径: p+c+k*L = 2*n; L为环路的周长,k是整数
显然,如果从p+c点开始,slow再走n步的话,还可以回到p+c这个点。
同时,fast从头开始走,步长为1,经过n步,也会达到p+c这点。
显然,在这个过程中fast和slow只有前p步骤走的路径不同。所以当p1和p2再次重合的时候,必然是在链表的环路入口点上。
参考文章
阅读全文
0 0
- 单链表判断环路及环路的入口
- 判断链表中是否有环路,以及求环路的入口点
- 转.如何判断单链表中是否有环路,如何求环路入口位置
- 转.如何判断单链表中是否有环路,如何求环路入口位置
- 路由环路的产生及解决
- 路由环路的产生及解决方案
- 路由环路的产生
- 地线环路的影响
- 图的环路问题
- 锁相环的环路带宽
- 如何判断链表中存在环路
- 如何判断链表中存在环路
- 如何判断链表中存在环路
- nyoj973天下第一spfa环路判断
- 判断一个单向链表是否有环路的算法
- 路由动态协议RIP协议的路由环路及解决办法
- (others)RIP协议的路由环路及解决办法
- 消除路由环路的技术
- java继承多态和抽象类接口
- spring boot实战(第一篇)第一个案例
- 用FaceNet的模型计算人脸之间距离(TensorFlow)
- 计算机经典编程书籍大全!附下载地址
- ROS学习笔记10 话题(topics)实例
- 单链表判断环路及环路的入口
- linux netstat
- tensorflow实现MNIST数据集识别
- 2016-08-14-京东笔试和面试(Java方向)
- 判断一个数是不是另一个数的整数次幂,python实现
- 分页boot—+angu
- 填坑之css中的换行与空白
- Android中shape属性详解
- Linux-进程状态&僵尸进程&孤儿进程