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