求有环单链表中的环长、环起点、链表长
来源:互联网 发布:java自增id生成策略 编辑:程序博客网 时间:2024/06/07 19:47
原文:http://www.cnblogs.com/xudong-bupt/p/3667729.html
1.判断单链表是否有环
使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。
就是所谓的追击相遇问题:
2.求有环单链表的环长
在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。
设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*len步,相遇时多走了一圈:
环长=2*len-len。
3.求有环单链表的环连接点位置
第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。
在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为LenA,连接点到第一次相遇点的长度为x,环长为R。
第一次相遇时,slow走的长度 S = LenA + x;
第一次相遇时,fast走的长度 2S = LenA + n*R + x;
所以可以知道,LenA + x = n*R; LenA = n*R -x;
4.求有环单链表的链表长
上述2中求出了环的长度;3中求出了连接点的位置,就可以求出头结点到连接点的长度。两者相加就是链表的长度。
编程实现:
下面是代码中的例子:
具体代码如下:
执行结果:
本文网址:http://www.cnblogs.com/xudong-bupt/p/3667729.html
参考网址:http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 【推导】求有环单链表中的环长、环起点、链表长
- 【启发】求有环单链表中的环长、环起点、链表长【快 、 慢指针】
- 单链表是否有环,求环起点,环长等
- 有环链表问题-确定有环链表的环起点,环长及柄长
- JDBC Oracle事务隔离(并发控制)
- Python学习笔记:语法基础3
- Django--1--基本操作&一个实例
- 51nod 1095 Anigram单词(map)
- HDU1754
- 求有环单链表中的环长、环起点、链表长
- 数组与内存控制
- SWIFT电文简介
- 如何调整虚拟机中Ubuntu系统显示尺寸大小
- yii-console
- JavaScriptSE6 let和const命令
- fbo的个人浅薄了解
- 由YouCompleteMe安装引起一系列问题
- 线程终止方式