檢測單鏈表是否有環有好幾種方法。
昨天真正把這個問題想了一下,琢磨小問題有時候還是挺有意思的,從上面的方法來看最簡單最好用的當然就是第二個增加變數,這個可以很好的檢測出環和節點。又好好想想此時的flag只是當作乙個標誌,只需要乙個bool變數或者一位就可以,想到只要一位就很好辦,難道就沒有一位是永遠空出來的嗎。下面先看看單鏈表結構體的定義。
struct test;
其中的c只是測試用的,沒什麼含義。從結構體的定義可以看出點問題了。結構體分配記憶體的時候位址會對齊結構體裡面成員位元組數最大的那乙個,也就是說,單鏈表節點的位址會四位元組對齊,因此單鏈表節點位址的最後兩位永遠是0,也就是說next指標的最後兩位肯定是0了, 這就給我們提供乙個flag,只要遍歷乙個節點將next的最後一位設為1就ok啦。
下面看看程式吧
struct test* test_cycle(struct test* head)
return 0;
}int _tmain(int argc, _tchar* argv)
; struct test t2 = ;
struct test t3 = ;
struct test t4 = ;
struct test t5 = ;
t1.next = &t2;
t2.next = &t3;
t3.next = &t4;
t4.next = &t5;
t5.next = &t3;
struct test* t_joint = test_cycle(&t1);
if(t_joint)
printf("%c", t_joint->c);
return 0;
}
這個程式最後沒有將所有next指標還原了,只要遍歷一下將所有的next的最後一位重置為0就行了。 檢測單鏈表是否有環
參考 判斷乙個單鏈表是否有環及環的鏈結點 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇...
判斷單鏈表是否有環
1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...
判斷單鏈表是否有環
鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...