链表中有环——怎么判断
2016-06-17 14:23
190 查看
对于给定的单链表,有如下问题:
1. 如何判断该链表中是否有环存在?
2. 如何计算出链表中环的长度?
3. 如何找到环的连接点,即环的入口?
4. 如何计算带环链表的长度?
对于问题1
我们设置一个快指针fast、一个慢指针slow。如果不存在环,那么fast总是先遇到null,而退出。如果存在环,fast总能追赶上slow,此时slow还没有完全遍历完链表,而fast则已经遍历了一圈。如下图所示:
fast和slow会在23所在的结点处相遇
Java实现代码如下
对于问题2
问题1中已经找到碰撞点,记为P,用动态指针依次遍历,再次遇到P所走的长度即为环的长度。
对于问题3
有公式证明:http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
对于问题4
问题2已经计算出环的长度,再加上问题3中计算头节点到连接点的距离即为链表长度
1. 如何判断该链表中是否有环存在?
2. 如何计算出链表中环的长度?
3. 如何找到环的连接点,即环的入口?
4. 如何计算带环链表的长度?
对于问题1
我们设置一个快指针fast、一个慢指针slow。如果不存在环,那么fast总是先遇到null,而退出。如果存在环,fast总能追赶上slow,此时slow还没有完全遍历完链表,而fast则已经遍历了一圈。如下图所示:
fast和slow会在23所在的结点处相遇
Java实现代码如下
/* Detect a cycle in a linked list. Note that the head pointer may be 'null' if the list is empty. A Node is defined as: class Node { int data; Node next; } */ boolean hasCycle(Node head) { // the default linked list does not have a cycle boolean flag = false; Node fast = head; Node slow = head; while(fast!=null && fast.next!=null){ slow = slow.next; fast = fast.next.next; if(fast==slow){ flag = true; break; } }//while end return flag==true?true:false; }
对于问题2
问题1中已经找到碰撞点,记为P,用动态指针依次遍历,再次遇到P所走的长度即为环的长度。
对于问题3
有公式证明:http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
对于问题4
问题2已经计算出环的长度,再加上问题3中计算头节点到连接点的距离即为链表长度
相关文章推荐
- 深入探究Swift数组背后的协议、方法、拓展(转)
- EventBus和litepal数据库的一般使用
- 在ubuntu 12.04上安裝Redmine
- Runtime 获取成员变量列表
- Android中findViewById获取控件返回为空问题怎么解决
- POJ 2406 KMP
- 防痴呆的:啤酒2元一瓶,四个瓶盖可换一瓶啤酒,2个空瓶也可换一瓶啤酒,10元最多可以喝多少瓶
- 暴力破解软件的破解选项如何设置
- wpf中ToolTip实现
- MongoDB 安装及问题解决
- Ubuntu 搭建PHP环境
- Linux shell使用详解
- 嵌入式Linux C语言(六)——内存字节对齐
- 安卓获取图片缩略图的两种方式
- stm32 外部中断库函数实现全程分析。(转,原作者历时三天,呕心沥血,剖析的很细致)
- Android ActionBar应用实战,高仿微信主界面的设计
- Android中Selsetor基本使用三,选中时改变CheckBox背景
- 再理解下ROC曲线和PR曲线
- iOS 发布证书跟应用
- 只控制input框只能输入数字,并控制小数位数