有环单链表的一些问题
来源:互联网 发布:广告招牌设计软件 编辑:程序博客网 时间:2024/06/06 00:46
给定一个单链表:
- 如何判断单链表是否有环?
- 如何找出环的连接点在哪里?
- 如何知道环的长度?
转载请注明出处。
单链表如上图所示。
1. 设置两个指针同时遍历链表,一个指针步长为1(V),另一个步长为2(2V)。当这两个指针相遇时,单链表有环。
假设链表头元素为A,环的连接点为B,链表头到环连接点的长度为L,环长度为S,
则,当V到达B时,2V到达D,B->D长为L mod S,D->B长为S - L mod S,
问题转化成了在环内的追逐,
在环中,2V指针要追S - L mod S这么多距离,才能碰到V,2V和V的相对速度为1,
所以从环内开始,指针相碰所用的时间为 (S - L mod S) / 1
这段时间内,2V前进了2(S - L mod S),V则从B到C,前进了(S - L mod S),两者碰于C点。
2. 两个步长为1的指针分别从链表首节点A和碰撞点C开始向前遍历,当两者相遇时,该节点即为环的连接点B。
B->C长为(S - L mod S),C->B长为L mod S。
当L<=S时,L mod S = L,所以 A->B = C->B = L,两者相等,必定相遇于B点;
当L>S时,假设Floor( L / S ) = i,则当从C开始遍历的指针第i+1次经过B点时相遇;
3. 从碰撞点C开始,2个指针又以不同的速度追逐,当再次相遇时,V经过的步长即为环长
因为相对速度为1,2V要追赶环长S的距离赶上V,所以这段时间内V刚好走过S。
- 有环单链表的一些问题
- hbm2java的一些问题
- 用友的一些问题
- 电子商务的一些问题
- 一些问题的解答!
- 一些奇怪的问题
- 登录的一些问题
- 一些问题的解决
- C的一些问题
- C的一些问题
- socket的一些问题
- C#的一些问题
- 一些问题的总结
- EDI的一些问题
- PowerDesign的一些问题
- SubVersion 的一些问题
- CEGUI 的一些问题
- 一些基础性的问题
- Python中的反射与自省
- 写程序想到的
- GridView创建空白行c#代码(收藏)
- hdu 2647 Reward 拓扑排序
- 编译器的认识
- 有环单链表的一些问题
- 收集ASP转ASP.NET过程典型问题
- 批量转换文件编码
- c++primer学习笔记(二)
- char *p 与char p[] 比较
- Android源码地址
- Dreamweaver 代码配色方案 DIY
- 重新安装vc++出现无法完全安装的解决方法
- iphone实例集锦