追擊理論判斷有環鏈表

背景:單鏈表正常情況下爲線性的,即無環,當鏈表出現變異,最後一個節點莫名其妙地指向了前面某個節點,則存在環,如何判斷單鏈表是否變異,即有環。

-----------------------------------------------------割---------------------------------------------------------------------

(1)首先想到暴力,試探後一節點是否指向前面任意節點,很顯然時間複雜度爲O(n^n)

(2)用個比較巧妙的方法,追擊理論,設置兩個指針p1=p2=head

p1每次向後移動一節,p2向後移動兩節;

如果沒有環,p2一定始終在p1之前,先到末尾;

如果有環,p2的速度比p1快,則一定會追上p1,類似於跑步時的套圈;

那麼會不會恰好兩個指針叉開?

如果是跑步,套圈則一定會相遇,因爲路程是連續的,不是跳格,

同樣當節點是一個一個的,對於節點來說,離散的一格一格即爲連續,所以,當有一個速度爲1時則一定會相遇。

這樣時間複雜度爲O(n)

僞代碼:

int Chase(List list)
{
	Node *p1,*p2;
	p1=list;
	p2=list;
	while(p1!=p2&&p2->next&&p2->next->next)
	{
		if(p1==p2) return 1;
		else
		{
			p1=p1->next;
			p2=p2->next->next;
		}
	}
	return 0;
}




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