判断链表是否存在环
问题:判断一个链表是否存在环,例如下面这个链表就存在一个环:
例如N1->N2->N3->N4->N5->N2就是一个有环的链表,环的开始结点是N5这里有一个比较简单的解法。设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。直到p2碰到NULL指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。
struct link {
int data;
link* next;
};bool CircleInList(Link* pHead)
{
if(pHead == NULL || pHead->next == NULL)//无节点或只有一个节点并且无自环
{
return (false);
}
if(pHead->next == pHead)//自环
{
return (true);
}
Link *pTemp1 = pHead;//step 1
Link *pTemp2 = pHead->next;//step 2
while(pTemp2 != pTemp1 && pTemp2 != NULL && pTemp2->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp2 = pTemp2->next->next;
}
if(pTemp2 == pTemp1)
{
return (true);
}
return (false);
}
类似题:找出单向链表的中间结点--引自绝对零度
这道题和解判断链表是否存在环可以用类似的方法,只不过结束循环的条件和函数返回值不一样罢了。设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。当p2到达链表的末尾时,p1指向的时链表的中间。
link* mid(link* head) { link* p1,*p2; p1=p2=head; if(head==NULL || head->next==NULL) return head; do { p1=p1->next; p2=p2->next->next; } while(p2 && p2->next); return p1; }