給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?
使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。
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一定能追上...