判断链表是否带环,以及环的入口

Posted peiyao456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断链表是否带环,以及环的入口相关的知识,希望对你有一定的参考价值。

给出一个链表,先判断链表是否带环,如果带环,求出环的入口。

判断是否带环:用快慢指针。快指针每走两步,慢指针走一步,如果两者在某个点处相

遇,则链表带环。

下边给出函数的实现代码:

typedef struct LinkNode
{
	DataType data;
	struct LinkNode *next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
	LinkNode *pHead;
}LinkList,*pLinkList;
pLinkNode isCircle(pLinkList plist)
{
	assert(plist);
	if (NULL == plist->pHead)
	{
		printf("链表为空\\n");
		return NULL;
	}
	pLinkNode fast = plist->pHead;
	pLinkNode slow = plist->pHead;
	while (fast && fast->next)
	{
		fast = fast->next->next;
		slow = slow->next;
		if (fast == slow)
			return fast;
	}
	return NULL;
}

如果

如果链表带环,看下边的图:


代码:

pLinkNode firstCrossNode(pLinkList plist)
{
	assert(plist);
	if (NULL == plist->pHead)
	{
		printf("链表是空\\n");
		return NULL;
	}
	pLinkNode ret = isCircle(plist);
	if (ret == NULL)
	{
		printf("链表不带环\\n");
		return NULL;
	}
	pLinkNode fast = plist->pHead;
	pLinkNode slow = ret;
	while (fast)
	{
		fast = fast->next;
		slow = slow->next;
		if (fast == slow)
			return fast;
	}
}


以上是关于判断链表是否带环,以及环的入口的主要内容,如果未能解决你的问题,请参考以下文章

判断链表是否有环,并判断环的入口以及环的长度

判断单链表是否带环,如果带环,求环的长度和入口结点

判断单链表是否带环,如果带环,求环的长度和入口结点

环形链表问题(判环求入口点)

环形链表问题(判环求入口点)

判断链表是否有环,环的入口以及环的长度