链表中有环——怎么判断
来源:互联网 发布:武汉美工速成班 编辑:程序博客网 时间:2024/04/24 02:01
对于给定的单链表,有如下问题:
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中计算头节点到连接点的距离即为链表长度
0 0
- 链表中有环——怎么判断
- Session超时怎么判断
- 怎么判断ios 版本
- 怎么判断ios 版本
- 怎么判断TXT文件类型?
- c#怎么判断输入法
- 怎么判断数据库连接超时
- 怎么判断是闰年
- 怎么判断ios越狱
- 怎么调用网络判断
- 怎么判断cCheckBox是否选中
- 怎么判断一个BUTTON控件
- JavaScript 年月日 代码怎么判断
- 怎么判断一个人有无灵魂
- js中undefined怎么判断
- HR怎么判断潜力的
- Gmail是怎么判断垃圾邮件
- 【Unity】怎么判断鼠标双击
- POJ 2406 KMP
- 防痴呆的:啤酒2元一瓶,四个瓶盖可换一瓶啤酒,2个空瓶也可换一瓶啤酒,10元最多可以喝多少瓶
- 选定一块区域,设置不同的透明度
- 在ubuntu 12.04上安裝Redmine
- EventBus和litepal数据库的一般使用
- 链表中有环——怎么判断
- 暴力破解软件的破解选项怎么设置
- 大数据大牛- sunddenly
- redis win2003 32位下载啊
- Android 读写文件整理
- 软件架构师的12项修炼--软技能篇
- Contains Duplicate判断数组是否有重复元素
- 在IntelliJ上操作GitHub
- JavaScript 原型对象的继承方法