判断链表是否有环
来源:互联网 发布:centos挂载硬盘 编辑:程序博客网 时间:2024/06/06 14:27
对于最简单的做法就是:
用一个指针走一圈,如果重复遇到其他任何一个指针,则证明有环。
但是这样做的问题就是:
单指针需要留下脚印,会弄脏链表数据,而如果不能脏数据的话,就需要增加一个容器,并且增加查找的开销。
有没有更好的方法呢?有的,定义一对快慢指针分别为ptr_fast,ptr_slow,ptr_slow走一步,ptr_fast走两步,如果ptr_slow和ptr_fast最终能相遇,那么证明有环。
解释如下:
画图:
设步长分别为x和y,链表回环结点数为n,非环回环为m
设经过t次跨步,则只要xt和yt对n同余并且xt和yt都大于m就可以相遇(假设x>y)
xt-yt=pn
yt>m
得到:
t=pn/(x-y) > m/y(只需pn可整除(x-y))
指针移动次数为(x+y)t=(x+y)/(x-y)*pn
而要想pn永远整除(x-y),那么x-y=1即可。在x-y固定为1的情况下x+y越小,则移动次数越少,也即指针比较次数越少,所以x为2,y为1。
出处:http://www.vimer.cn/2010/10/%E4%B8%80%E9%81%93%E4%B8%8D%E9%94%99%E7%9A%84%E7%AE%97%E6%B3%95%E9%A2%98-%E5%88%A4%E6%96%AD%E9%93%BE%E8%A1%A8%E6%98%AF%E5%90%A6%E6%9C%89%E7%8E%AF.html
- 判断链表是否有环
- 判断链表是否有环
- 如何判断链表是否有环
- 判断链表是否有环
- 判断链表是否有环
- 判断一个链表是否有环
- 单向链表判断是否有环
- 判断链表是否有环
- 判断一个链表是否有环
- 判断链表是否有环
- 算法-判断链表是否有环
- 判断链表是否有环
- 判断一个链表是否有环
- 判断链表是否有环
- 判断循环链表是否有环
- 判断链表是否有环
- 判断链表是否有环
- 判断链表是否有环问题
- 在Android C/C++层添加LOG调试(LOGI\LOGD\LOGE...)输出支持
- 关于多次颁发ios开发证书后,真机调试的错误问题解决
- UVA11401(Triangle Counting)
- 用JAVA中的多线程示例火车站售票问题
- 多位数处理
- 判断链表是否有环
- DI写作思路
- UVa 10161 - Ant on a Chessboard
- php定时发送邮件解决方案
- 运算符重载
- Embedding Python in Multi-Threaded C/C++ Applications
- MYSQL强制使用索引和禁止使用索引
- Thrift安装与常见错误
- extjs 之布局方式一(absolute,accordion)
问题如下: 一个单向链表,怎么判断他是否存在环?