人的一生犹如负重致远,不可急躁。 以不自由为常事,则不觉不足。 心生欲望时,应回顾贫困之日。 心怀宽恕,视怒如敌,则能无视长久。 只知胜而不知敗,必害其身。 责人不如责己,不及胜于过之。
分类: IT职场
2017-03-04 18:26:00
单链表是否有环
1 单链表是否有环的相关问题
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
2 单链表的可能存在的形态
2.1 无环单链表
2.2 有环单链表
2.3 环形单链表
3 问题解答
假设单链表的总长度为L,头结点到环入口的距离为a,环入口到快慢指针相遇的结点距离为x,环的长度为r,慢指针总共走了s步,则快指针走了2s步。另外,快指针要追上慢指针的话快指针至少要在环里面转了一圈多(假设转了n圈加x的距离),得到以下关系:
(1) s = a + x;
(2) 2s = a + nr + x;
(3) a + x = nr; 由(1)和(2)式得(3)
(4) a = nr - x; 由(3)得(4)式
如下图:
3.1 如何判断是否存在环?
使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。
由假设推理得出
当a>0,在环内相遇。
当a=0,在环的头指针处相遇。
3.2 如何知道环的长度?
记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞所走过的操作数就是环的长度s。
3.3 如何找出环的连接点在哪里?
有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
由上式可知:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点。
3.4 带环链表的长度是多少?
问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度。
参考链接: