判断一个单链表是否有环及环的连接点问题
2016-03-01 20:47
309 查看
给定一个单链表,只给出头指针h:
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
解:1)设置两个指针slow和fast, slow每次走一步, fast每次走两步。如果存在环的话, fast 肯定能追上slow。如果不存在环,当fast为Null时
退出。所以当slow等于fast时,说明存在环。
2)记相遇点位p。 slow 再次出发, 当回到相遇点时,走过的节点数就是环的长度。
3)如下图
![](http://s11.sinaimg.cn/large/4705a6e14aca6cb6b9b0a&690)
设slow 走的路程 s1 = a + x;
fast 走的路程 s2 = a+x+nr; // n为转的圈数
s2 = 2s1;
所以a+x = nr;
不妨取n=1, 所以 a = r - x;
所以slow开始从相遇点开始转, head从头开始,每次走一步, 当两者相遇时,便为连接点。
4)第三步可以记录从头到连接点的长度,第二步得出环的长度,所以可以得出链表的长度
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
解:1)设置两个指针slow和fast, slow每次走一步, fast每次走两步。如果存在环的话, fast 肯定能追上slow。如果不存在环,当fast为Null时
退出。所以当slow等于fast时,说明存在环。
2)记相遇点位p。 slow 再次出发, 当回到相遇点时,走过的节点数就是环的长度。
3)如下图
设slow 走的路程 s1 = a + x;
fast 走的路程 s2 = a+x+nr; // n为转的圈数
s2 = 2s1;
所以a+x = nr;
不妨取n=1, 所以 a = r - x;
所以slow开始从相遇点开始转, head从头开始,每次走一步, 当两者相遇时,便为连接点。
4)第三步可以记录从头到连接点的长度,第二步得出环的长度,所以可以得出链表的长度
相关文章推荐
- Flume采集rsyslog日志并发送到elasticsearch上
- asp.net页面之间的跳转
- 浏览器XMLHttpRequest案例
- 玩转AI(Adobe illustrator)——小西瓜(1)
- unitywebgl发展计划
- Linux学习笔记:linux下的文件以及对文件的简单操作
- [总结]CDQ分治&整体二分
- Apache shiro 笔记整理之web整合二
- Android 工程报错解决 Unable to resolve target 'android-17'
- Android配置文件中<uses-sdk>标签
- zzulioj 1730: 通信基站 (全排列&DFS)好题
- Python练习(2):递归解决汉诺塔问题
- mtime、ctime、atime
- 《leetCode》: Reverse Bits
- 要适当跳出自己的圈子
- [土狗之路]coursera C语言进阶 习题 分配病房
- 事件分发机制
- Linux下的IO模式
- iOS与内存管理
- 值类型和引用类型区别