码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-24 15:02:35      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

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

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

遇,则链表带环。

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

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;
	}
}


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

标签:

原文地址:http://blog.csdn.net/peiyao456/article/details/51751969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!