定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的
|
思路就是弄两个指针,开始指向不同的链表不同的位置,然后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;
}