這個問題可以用我們小學時期奧數題裏面的經典:相遇問題來解決。
思路:,找兩個指針,起始都指向頭部,循環向後走。每一次循環,一個指針一次性走兩步,另一個一次性走一步。如果兩個指針能夠相遇,則證明這個鏈表成環。如果直到兩指針中的任意一個指向空了,就代表該鏈表無環。
判斷函數如下:
SListNode *JugdeCircle(SListNode *head)
{
SListNode *fast = head;
SListNode *slow = head;
while (fast&&slow&&fast->next)//這裏還要加上fast->next,避免找不到fast的next的next
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)//右對齊,找到相遇點,則說明有環
{
return fast;
}
}
return NULL;
}
測試:
int main()
{
SListNode *phead;
SListNode *plast = NULL;
SListInit(&phead);
SListPushFront(&phead, 1);
plast = phead;
SListPushFront(&phead, 2);
SListPushFront(&phead, 3);
SListPushFront(&phead, 4);
plast->next = phead;//先成一個環
SListNode * ret = JugdeCircle(phead);
printf("%d\n", ret->data);
return 0;
}
結果應該爲4.
鏈表頭插函數和SListNode 結構體在我的前兩篇數據結構類的文章內都可以找到,這裏就不放了。