博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断单链表是否有环,如果有怎么找到进入环的节点
阅读量:5248 次
发布时间:2019-06-14

本文共 1147 字,大约阅读时间需要 3 分钟。

转载自gaofen100博客园,感谢作者整理!

How can one determine whether a singly linked list has a cycle?

第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(n)的空间和时间。

 

第二种方法是设置两个指针指向单链表的head, 然后开始遍历,第一个指针走一步,第二个指针走两步,如果没有环,它们会直接走到底,如果有环,这两个指针一定会相遇。

 

现在找出环的起始位置:

Cpp代码 
1 /* (Step 1) Find the meeting point. This algorithm moves two pointers at   2 * different speeds: one moves forward by 1 node, the other by 2. They   3 * must meet (why? Think about two cars driving on a track—the faster car   4 * will always pass the slower one!). If the loop starts k nodes after the   5 * start of the list, they will meet at k nodes from the start of the   6 * loop. */   7 n1 = n2 = head;    8 while (TRUE) {    9     n1 = n1->next;   10     n2 = n2->next->next;   11     if (n1 == n2) {   12         break;   13     }   14 }   15 // Find the start of the loop.   16 n1 = head;   17 while (n1->next != n2->next) {   18     n1 = n1->next;   19     n2 = n2->next;   20 }   21 Now n2 points to the start of the loop.

 

转载于:https://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/16/2643020.html

你可能感兴趣的文章
冲刺第六天
查看>>
内部排序(堆排序)
查看>>
操作系统面试总结
查看>>
HTML你应该知道的三大基本元素
查看>>
Jquery页面操作
查看>>
delphi webbrowser 获取iframe
查看>>
微信小程序(8)--头部导航滑动
查看>>
JQuery排错关于$(document).ready(function(){});
查看>>
Linux如何查看与/dev/input目录下的event对应的设备
查看>>
C++语言十进制数,CDecimal(未完成)
查看>>
xcode自动打ipa包脚本 资料
查看>>
MKMapView:确定区域更改是否来自用户交互
查看>>
关于cout<<ends你不知道的那些事
查看>>
C语言第二次博客作业---分支结构
查看>>
vim编辑器的使用
查看>>
Java的IO操作,个人理解。
查看>>
turtle库基础练习
查看>>
OpenCV--用读取矩阵,访问图像数据
查看>>
[转]TTF字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)
查看>>
【Spark】Spark-foreachRDD需要注意的问题
查看>>