|
定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的
|
思路就是弄两个指针,开始指向不同的链表不同的位置,然后1个指针移动间隔是1,一个指针移动间隔是2,如果快的能追上慢的,那说明就有环了。就如何两个人绕圈跑步,速度不一样,如果速度快的能追上慢的,那说明跑道是环型的。
bool CircleInList(Link* pHead)
{
if (pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环
{
return false;
}
if (pHead->next = = pHead)//自环
{
return true;
}
Link *pTemp1 = pHead;
Link *pTemp = pHead->next;
while (pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if (pTemp == pTemp1)
{
return true;
}
return false;
}
思路就是弄两个指针,开始指向不同的链表不同的位置,然后1个指针移动间隔是1,一个指针移动间隔是2,如果快的能追上慢的,那说明就有环了。就如何两个人绕圈跑步,速度不一样,如果速度快的能追上慢的,那说明跑道是环型的。
bool CircleInList(Link* pHead)
{
if (pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环
{
return false;
}
if (pHead->next = = pHead)//自环
{
return true;
}
Link *pTemp1 = pHead;
Link *pTemp = pHead->next;
while (pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if (pTemp == pTemp1)
{
return true;
}
return false;
}
链表环检测算法
本文介绍了一种检测链表中是否存在环的有效算法。通过使用两个指针,一个快指针每次移动两步,一个慢指针每次移动一步,如果链表中有环,则快指针最终会追上慢指针。该方法适用于各种链表结构,包括单链表和循环链表。
6391

被折叠的 条评论
为什么被折叠?



