判断单链表是否有环

原创 2012年03月23日 10:45:01

链表结构:

struct List
{
	int data;
	List* next;
};


(1)判断单链表是否有环

采用追赶法,设置两个指针p和q,从链表表头开始,p每一步走两个节点,q每一步走一个节点,如果链表有环则p和q必相遇。

代码如下

// 判断链表是否有环,时间复杂度O(n),空间复杂度O(1)
List* hasLoopInList( List* head )
{
	List *p, *q;
	p = q = head;
	
	do 
	{
		if ( p->next != NULL && q->next != NULL )
		{
			p = p->next->next;
		}
		else
		{
			return NULL;
		}
		q = q->next;
	} while ( p != q );

	return p;
}

(2)找到环的起始入口(交叉点)

设链表总长度为L,链表头节点到交叉点的距离为x,环长为y,则L=x+y;

设节点p和q共走了s步相遇,由于p每次走两个节点,q每次走一个节点,因此p共走2s个节点,q共走s个节点;

设p与q相遇时,p共绕环走了n圈(n>=1),q绕环第一圈未走完,q和p相遇点距环其实节点为a=s-x;

则p所走总节点数2s满足:2s=ny+x+a=ny+x+(s-x)=ny+s;

由上式进一步得到:ny=s=a+x   => a=ny-x;

从而相遇点顺着环的方向再经过r=y-a=个节点到达环的起始入口;

由a=ny-x带入r=y-a,得到r=x-(n-1)y,即x=r+(n-1)y;

因此若设置两个指针,一个从链表头节点开始每一步走一个节点,另一个从相遇点开始每一步走一个节点,则两指针必定在环的起始入口相遇。

根据以上分析,实现找出环起始入口的代码为:

// 如果有环,返回环的起始节点,时间复杂度小于O(n),空间复杂度O(1)
List* findStartNodeOfLoopInList( List* head, List* meetNode )
{
	if ( head == NULL || meetNode == NULL ) return NULL;
	
	List* p = head;
	List* q = meetNode;

	while( p != q )
	{
		p = p->next;
		q = q->next;
	}

	return p;
}

题目:代码实现判断单链表是否有环

一、单链表环的定义: 有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D。 题目:0.如何判断单链表里面是否有...

leetcode OJ 判断单链表中是否有环

单链表的结构体为:

如何判断单链表里面是否有环【转载】

如何判断单链表里面是否有环【转载】 题目:0.如何判断单链表里面是否有环? 算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在...
  • ustcyb
  • ustcyb
  • 2012年08月30日 14:23
  • 498

单链表中判断是否存在环

转自http://blog.csdn.net/hitulric/article/details/6646121 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节...
  • wdqbupt
  • wdqbupt
  • 2011年10月24日 05:23
  • 267

判断单链表是否带环

//这个题思路不难,我们只要定义两个指针,一快一慢,快指针一次走两步,慢指针一次走一步 //如果它们相遇,则单链表构成了环形结构。 如果未相遇, 而快指针走到了链表结尾,则单链表未构成环形结构 #in...
  • ssopp24
  • ssopp24
  • 2017年07月08日 21:34
  • 541

如何判断单链表中是否有环?如何找到环中的起始节点

今天在leetcode上做了一道题:

判断单链表是否有环以及碰撞点连接点

给定一个单链表,只给出头指针h: 1、如何判断是否存在环? 2、如何知道环的长度? 3、如何找出环的连接点在哪里? 4、带环链表的长度是多少? 解法: 1、对于问题...

笔试题:如何判断单链表是否存在环

今天做了LeetCode上面的题,问的是

单链表如何判断是否存在环

给定一个单链表,只给出头指针h: 1、如何判断是否存在环? 2、如何知道环的长度? 3、如何找出环的连接点在哪里? 4、带环链表的长度是多少? 解法: 1、对于问题1,使用追赶的方法,设定两个指...

C语言中怎么判断单链表中是否有环?

第一步:检测链表是否有环。 方法还是比较多的,这里先讲一个:快慢指针。 快慢指针的方法,就是让两个指针同时指向链表。在向后遍历的时候,一个指针每次走两步,称为快指针;一个指针每次走一步,称...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:判断单链表是否有环
举报原因:
原因补充:

(最多只允许输入30个字)