鍊錶 若單鏈表存在環,如何找到環的入口點。

2021-06-07 13:21:55 字數 530 閱讀 2081

【演算法】

這個完全是通過數學推導出來的,設一快、一慢兩個指標,快指標的步長為2,慢指標為1,假設鍊錶起點到環入口點之間的距離為x,環入口點到重合點的距離為y,假設在相遇之前慢指標走的s,則快指標必然走2s,所以有如下公式:

s = x + y

2s = nr + s(假設環的周長為r,在相遇前快指標走了n圈)

由公式2推導出s = nr,帶入公式1得到nr = x + y ===> x = nr -y;

現在再設兩個指標p1、p2,步長均為1,p1從單鏈表起點開始遍歷,p2從相遇點開始遍歷(相遇點可以得到),根據公式x=nr-y,當p1移動x步時(移動到了入口處),p2移動了nr-y步,由於p2是從相遇點開始遍歷的,故nr表示又回到了相遇點,-y表示倒退y步(表示入口點到相遇點的距離),由此可以得到p1和p2是同時到達入口點的。

故演算法可以寫為:

node* findentry(node* head, node* encounter)

return p1;

}

單鏈表是否存在環

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

如何判斷單鏈表是否存在環

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

如何判斷單鏈表是否存在環

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