判斷鍊錶是否有環,求環的入口點及環長

2021-06-20 12:45:53 字數 1144 閱讀 3107

今天的內容主要包括三部分,rt。

1。判斷鍊錶是否帶環

判斷鍊錶是否帶環,我們可以採用在頭結點設兩個指標,乙個叫fast,乙個叫slow,fast一下走兩步,而slow一下走一步。如果鍊錶中存在環的話,那麼fast和slow必定會在環中相遇。若煉表中沒有環的話,那麼fast必定現於slow指標先到達鍊錶的尾節點(->next = null)。我們現在來思考乙個問題,為什麼鍊錶中存在環,則slow和fast會在環中相遇?這個道理,我們可以聯想我們跑步追趕的例子,跑道是前面一段直行路,

後面是乙個圓圈,當跑步選手進入環形跑道之後就只能在環形跑道裡面繼續奔跑。有兩名選手在起點同時出發,那麼我們很容易明白跑得快的選手肯定會追趕上跑的慢的選手。哎,生活中都是學問啊,有木有???

2. 求環的入口點

老實說,求環的入口點有點複雜。我也是在看了一些前輩們的文章才比較清楚到底是怎麼一回事(我們先看一幅圖,這幅圖也是我在程式中構造帶環鍊錶的原型。

如上圖所示,12為帶環鍊錶的入口點,簡單分析可知243是fast和slow的相遇點(鵲橋相會啊==!),a為環入口點到頭結點的路程,x為相遇點到環入口點的路程。我們假設slow指標走過的路程為s,那麼fast指標走過的路程則為2s,假設環長為c。且有

2s = s + nc

s = a + x

有上述式子,我們可以得到

a + x = nc

a = nc – x

a = (n – 1)c + c -x

式子化來化去,到這兒,我們是不是感覺有點不對經,好想如果在頭結點位置和相遇點位置分別再派出兩名跑步選手,並且他們都每次只跑一步,好像會在環的入口點相遇啊!!!恭喜你,答對啦!具體原因我們再分析分析最後乙個式子就能明白了。啊。。。。求個環的入口點,我容易嘛我??

3.求環長

求環長就比較容易啦,沒用到什麼數學知識,對於數學知識捉急的我真是終於松了一口氣。就是再環的入口點設一指標和一計數器,讓這一指標在環裡面跑,計數器不斷自增。當這一指標回到環的入口點的時候,環長就出來啦!

4.完整**請見:

5.測試平台www.anycodex.com

明天的任務是求兩鍊錶是否相交,在鍊錶存在有環的情況。繼續努力,機會只留給有準備的人!!!

判斷鍊錶是否有環及環的入口

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...

演算法題 判斷鍊錶是否有環,求環的入口點及環長

首先,我們採用快慢指標來判斷鍊錶是否有環,假設有環,快慢指標定會在某一刻在一點相聚。下面要解決的問題是如何找到這個環的入口 a為環入口點到頭結點的路程,x為相遇點到環入口點的路程。我們假設slow指標走過的路程為s,那麼fast指標走過的路程則為2s,假設環長為c。且有 2s s nc s a x ...

判斷鍊錶是否有環以及尋找環入口

思路 採用 快慢指標 查檢查鍊錶是否含有環。讓乙個指標一次走一步,另乙個一次走兩步,如果鍊錶中含有環,快的指標會再次和慢的指標相遇。這裡需要注意的一點是演算法中迴圈的條件,這是乙個很容易被忽略的細節。1 因為fast指標比slow指標走得快,所以只要判斷fast指標是否為空就好。由於fast指標一次...