數據結構--給定一個鏈表,判斷鏈表中是否有環

這個問題可以用我們小學時期奧數題裏面的經典:相遇問題來解決。
思路:,找兩個指針,起始都指向頭部,循環向後走。每一次循環,一個指針一次性走兩步,另一個一次性走一步。如果兩個指針能夠相遇,則證明這個鏈表成環。如果直到兩指針中的任意一個指向空了,就代表該鏈表無環。
判斷函數如下:

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 結構體在我的前兩篇數據結構類的文章內都可以找到,這裏就不放了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章