您的位置:首页 > 其它

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

2017-07-15 13:09 204 查看
给出一个链表,先判断链表是否带环,如果带环,求出环的入口。

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

遇,则链表带环。

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

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐