Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153812
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 378
  • 用 户 组: 普通用户
  • 注册时间: 2017-01-17 11:19
个人简介

人的一生犹如负重致远,不可急躁。 以不自由为常事,则不觉不足。 心生欲望时,应回顾贫困之日。 心怀宽恕,视怒如敌,则能无视长久。 只知胜而不知敗,必害其身。 责人不如责己,不及胜于过之。

文章分类

全部博文(34)

文章存档

2018年(2)

2017年(32)

我的朋友

分类: 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  如何判断是否存在环?

使用追赶的方法,设定两个指针slowfast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。

由假设推理得出

a>0,在环内相遇。

a=0,在环的头指针处相遇。

3.2    如何知道环的长度?

记录下问题1的碰撞点pslowfast从该点开始,再次碰撞所走过的操作数就是环的长度s

3.3    如何找出环的连接点在哪里?

有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。

由上式可知:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点。

3.4  带环链表的长度是多少?

         问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度。

 

 

 

 

参考链接:

http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html

阅读(434) | 评论(0) | 转发(0) |
0

上一篇:线程同步与阻塞

下一篇:排序算法

给主人留下些什么吧!~~