演算法實現 使用快慢指標,檢測單鏈表是否存在迴圈

2021-05-27 12:58:37 字數 743 閱讀 6177

今天的題目是檢查單鍊錶是否存在迴圈。對於初學者來說,要解決這個問題,最可能採取的方法就是使用兩個迴圈。當外層迴圈步進乙個節點時,內層迴圈就遍歷外層迴圈節點之後的所有節點,然後比較內外迴圈的兩個節點。若有節點位址相等,則表明該單鏈表有迴圈,反之則不存在迴圈。

這種方法無疑效率比較低。

今天給大家介紹乙個經典的方法,通過快慢指標來檢查單鍊錶是否存在迴圈。其思路很簡單,大家可以想一下上體育課長跑的情景。當同學們繞著操場跑步的時候,速度快的同學會遙遙領先,最後甚至會超越其它同學一圈乃至n圈——這是繞圈跑。那麼如果不是繞圈跑呢?速度快的同學則會一直領先直到終點,不會再次碰到後面的速度慢同學——不考慮地球是圓的這種情況o(∩_∩)o哈!

快慢指標的設計思想也是這樣。快指標每次步進多個節點——這個視情況而定,慢指標每次只步進乙個節點。那麼如果該鍊錶存在迴圈的話,快指標一定會再次碰到慢指標,反之則不存在迴圈。

下面上**

struct list_node

;#define false 0

#define true 1

typedef unsigned char bool;

bool is_list_exist_loop(struct list_node *head)

elseif(

!fast)}

/* 慢指標步進 */

slow = slow->next;

}return false;}

仍然是拋磚引玉,大家還有什麼經典的方法來解決這個問題呢?

快慢指標尋找單鏈表中間值

fastsearch.cpp 鍊錶快速查詢中間值,快慢指標的方法 include stdafx.h include struct linklist linklist head linklist malloc sizeof linklist 初始化鍊錶 尾插法 void listinitial lin...

判斷單鏈表是否有環(快慢指標)

方法一 使用p q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點,看p走的步數是否和q一樣。如圖,當p從6走到3時,用了6步,此時若q從head出發,則只需兩步就到3,因而步數不等,出現矛盾,存在環。方法二 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某個時候p q,則存...

判斷單鏈表是否為回文,快慢指標和棧

判斷單鏈表是否為回文,快慢指正加棧的方式解決 首先輸入這個鍊錶的長度,然後用尾插的方式,初始化鍊錶。接下來用快慢指標。快指標每次走兩步,慢指標每次走一步,當快指標的next為null時 也就是快指標走到了最後乙個 那麼慢指標剛好就在中間,因為鍊錶沒有環,所以將鍊錶的情況分為奇數和偶數兩種情況。當長度...