定义两个指针p、q,然后让p、q同时从链表头向后查找,注意他们移动的步幅是不同的分别为a
、b,例如p指针每次执行一次【p = p->next;】q每次执行两次【q = q->next;】,如果q先到链尾【if(q->next == NULL)】则没有死循环(这里假设q比p的移动速度要快),如果p、q在此之前相遇了则有死环。
实现的函数如下:
bool CircleInList(Link* pHead)
{
if(pHead == NULL || pHead-> next == NULL)//无节点或只有一个节点并且无自环
{
return (false);
}
if(pHead-> next == pHead)//自环
{
return (true);
}
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead-> next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp-> next != NULL)
{
pTemp1 = pTemp1-> next;
pTemp = pTemp-> next-> next;
}
if(pTemp == pTemp1)
{
return (true);
}
return (false);
}