鍊錶環問題

2021-09-27 03:34:42 字數 1044 閱讀 7262

給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?

使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。

1.判斷鍊錶是否有環?

如果快慢節點相遇,那麼鍊錶有環。

2.如果有環,環的長度是多少?

快慢指標相遇後,固定其中乙個指標(如快指標)不動,另乙個指標(即慢指標)以步長為1前進,下次相遇之前,慢指標走的步數就是環的長度

3.如果有環,環的入口是哪個節點?

有環時,第一次相遇後,慢指標回到起點,快指標位置不變,此時兩者都一步一步向前走,再次相遇則是環的入口。解釋:

假設起點到環入口距離為m,環長度為n,則第一次相遇時,快指標走的步數為2s=m+a*n+k(不一定就在環入口相遇,所以加上k),慢指標走的步數為: s=m+b*n+k(在圈很大的時候,也有可能慢指標繞了好幾圈才和快指標相遇),所以兩者走的步數差為: 2s-s=s=(a-b)*n,即s是環長度的整倍數,這時候慢指標回到頭指標,快指標仍然在原地,兩者同樣的速度(每次一步)向前走,當慢指標走了m步走到環入口時,快指標從最一開始走了m+2s步,因為s是環長度的整倍數,那麼久可以判定此時快指標也在環入口了,即此時快指標和慢指標在環入口相遇了 。

#includeusing namespace std;

struct node

node * next;

int value;

};bool check_circle(node *head)

return false;

}int get_loop_length(node * head )

return loop_length;

}node * get_entrance(node *head)

} if(!is_find_circle) return null;

slow=head;

while(slow!=fast)

return slow;

}node * init()

int main()

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

鍊錶有環問題

判斷乙個鍊錶是否有環 解析 如果鍊錶有環,則設定乙個指標,該指標會一直迴圈下去。我們可以設定兩個指標,乙個一次走一步,乙個一次走兩步,如果有環最終兩者會相遇,否則每次走兩步的指標最先走到鍊錶尾部。如下圖 延伸 判斷兩個鍊錶是否相交 給出兩個單向鍊錶的頭指標,比如l1,l2,判斷這倆個鍊錶是否相交。1...

鍊錶判斷環問題

問題 編寫函式判斷乙個鍊錶是否含有環,如果有環要求輸出環的起始位置,然後測試結果 此題考研時候做資料結構演算法部分題目練習的時候曾經做過,不過當時沒有要求求環的起始位置,當時題目的解法是 定義兩個指標p1,p2,p1每次移動乙個位置,而p2每次移動兩個位置,這樣如果鍊錶中存在迴圈,那麼p2一定能追上...