判断单链表是否形成环形结构,快慢指针
来源:互联网 发布:迅雷水晶矿场软件 编辑:程序博客网 时间:2024/06/05 14:19
判断一个单链表是否有环,若有,找出环的入口节点
分析:
一个单链表有环,必须是链表尾部带环;
(图片来自http://www.nowamagic.net/librarys/veda/detail/2245)
判断单链表是否有环,利用快慢指针的原理, 设置快慢指针 fast 、 slow 都指向单链表的头节点, 其中 fast 的移动速度是 slow 的2倍。
- 如果在fast==slow前,fast走到next==null结点,即没有环;
如果是有环的链表的话,当快慢指针(slow、fast)相遇时,slow指针肯定没有遍历完链表,而fast指针已经在环内循环了。
为什么会肯定的说,会在slow转第满一圈前的时候两指针必然相遇呢?
不妨设环长为L,第一个指针P1第一次进入环时,第二个指针P2在P1前方第a个结点处(0 < a < L);
设经过x次移动后两个指针相遇,那么应该有
0+x = (a + 2x) (mod L);
x =nL-a。(n=1,2,3….)
我们取第一次相遇,即n=1;所以有x=L-a.
下面这张图可以清晰地表明这种关系,
经过x = L-a次移动,P1向前移动了L-a个位置(相当于后退了a),到达P1′处,
而P2向前移动了2L-2a个位置(相当于后退了2a),到达P2′处,P1′和P2′相遇。
所以说,slow(P1) 在走步 x<圈长,后必然与fast相遇。
图片来自博客http://blog.csdn.net/loveyou426/article/details/7927297
也就是说,当在环里转圈时,如果A的速度是B的速度的2倍,A是肯定会追上B的,追上的点,就是开始时B位置 后面- 刚开始时A B距离;在A的第一圈,B的第二圈相遇。
参考:
http://blog.csdn.net/loveyou426/article/details/7927297
http://www.cnblogs.com/xiaodi914/p/5795096.html#commentform 介绍较具体
http://www.nowamagic.net/librarys/veda/detail/2245
http://www.2cto.com/kf/201603/493257.html 代码简单明了
指针p1从链表头、p2从相遇点,同时出发,一次移动一个节点,再次的相遇点便是环的入口点。
找入口原因:
http://blog.sina.com.cn/s/blog_6a0e04380101a9o2.html
- 判断单链表是否形成环形结构,快慢指针
- 【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针
- 使用快慢指针判断单链表是否存在环
- 剑指-判断一个单向链表是否形成了环形结构
- 面试题:判断单链表是否为循环链表-快慢指针
- 【面试题】-判断单链表是否有环并找到环入口(快慢指针)
- 运用快慢指针判断链表是否有环
- 链表趣题---快慢指针判断链表是否有环
- 判断单链表是否成环形
- leetcode_234. Palindrome Linked List 判断单链表是否为回文串,快慢指针法找中间节点,反转单链表
- 判断单链表是否存在环,如果存在则寻找环的入口点,用快慢指针法
- 【java基础 13】两种方法判断hashmap中是否形成环形链表
- 用快慢指针判断单链表环,找到环入口 扩展到判断两个链表是否相交
- 判断一个单向链表是否形成了环状结构
- 判断链表是否有环为什么快慢指针一定会相遇
- Leetcode ☞ 141. Linked List Cycle 【快慢指针 判断是否有环】
- 快慢指针判断单向链表是否有环及找环入口
- 快慢指针判断单链表中是否存在环,存在返回环的起点的值
- YouCompleterMe:No semantic completer exists for filetypes:['cpp']
- 10. 软件发布
- 小白的2017书单(三)前端
- Android判断设备是手机还是平板
- Codeforces Round #420 (Div.2)
- 判断单链表是否形成环形结构,快慢指针
- weight和weightSum
- java线程
- Lintcode78 Longest Common On Prefix solution 题解
- 【脚本语言系列】关于Python容器,你需要知道的事
- 11. fae来协助调试_办法
- Web图书管理系统---分页、上传、下载、增删改查
- html事件(onclick、onchange等)传对象作为参数
- iOS_UIDevice