從數學原理剖析鍊錶中的環問題

2021-10-08 12:49:49 字數 1936 閱讀 8472

找題目太麻煩了,為了偷懶,本文中前面7個題目引用自以下文章:

不過描述方式並不是照抄,是根據自己的理解從數學原理層面進行了說明

很多同學在面試時,都遇到過煉表中的環問題,本文對於鍊錶環的常見問題給出解答,並對原因進行透徹的分析。

先列一下常見的問題:

1.給乙個單鏈表,判斷其中是否有環的存在;

2.如果存在環,找出環的入口點;

3.如果存在環,求出環上節點的個數;

4.如果存在環,求出鍊錶的長度;

5.如果存在環,求出環上距離任意乙個節點最遠的點(對面節點);

6.(擴充套件)如何判斷兩個無環鏈表是否相交;

7.(擴充套件)如果相交,求出第乙個相交的節點;

8.如果存在環,如何遍歷輸出每個元素?或者換個問法:如何正確釋放每個元素?

下面我們對每個問題進行解答:

這個題目比較常見,很多同學也知道答案:採用「快慢指標」的方法。就是有兩個指標fast和slow,開始的時候兩個指標都指向煉表頭head,然後在每一步操作中slow向前走一步即:slow = slow->next,而fast每一步向前兩步即:fast = fast->next->next。

由於fast要比slow移動的快,如果有環,fast一定會先進入環,而slow後進入環。當兩個指標都進入環之後,經過一定步的操作之後二者一定能夠在環上相遇。

但是,這個答案的原因大家有沒有深究過?

假設slow進入環的入口時,fast剛好迴圈了n圈,也到了入口,那麼會立即相遇。但排除這種特殊情況,假設fast到slow的距離為n,根據小學數學中的速度追趕問題,我們可以很容易的判斷出,經過n步,fast和slow一定會相遇。並且n一定小於環的總長,因此,相遇時,slow必然還沒有走完一圈。

從上面的分析知道,當fast和slow相遇時,slow還沒有走完鍊錶。

我們先給出幾個術語,方便理解:

l:煉表頭到入口的距離

r:環的周長

s:slow和fast第一次相遇時的時間,即相遇時slow行走的距離

根據前文,我們可以得到以下結論:

2s-s=r*n:相遇時,fast以及在環中迴圈了n次,n>=1,可得到s=r*n。

s>=l && s簡單的數數(或者叫遍歷),在第乙個題目的答案基礎上,相遇後,fast指標不動,slow指標繼續每次向前走一步,再次與fast重合時行走的距離,即是環的長度。

鍊錶總長度=煉表頭到入口的距離+環的周長。

在第二題與第三題的基礎上,計算l+r即可。

有2個思路:

a.如果已經計算出了環的長度,在指定點向前行r/2即可。

ps:如果r為奇數,向下取整,或者向上取整都可,這兩個點都是距離最遠的點。

b.如果未計算出環的長度,可以繼續使用第乙個題目的思路,在指定點設定fast和slow兩個指標,當fast完成迴圈(r為偶數),或者fast=指定點->next(r為奇數),或者fast->next=指定點(r為奇數),此時slow指向的位置即為最遠點。

ps:本質上和思路1是一樣的,都是走環的一半,只是前提條件不同,使用了不同的方式。

有2個思路:

a.暴力破解:對鍊錶1上的每個點,遍歷鍊錶2,查詢是否有相同。如找到,則判斷為相交。

時間複雜度:鍊錶1長度為m,鍊錶2長度為n,則時間複雜度為o(m*n)

b.轉換為已知問題,再使用已有的討論解答:將鍊錶1的尾部指向頭部,變成乙個新的鍊錶。如果鍊錶2與鍊錶1相交,則鍊錶2就變成了有環鏈表;如果鍊錶2與鍊錶1不相交,則鍊錶2不變,依然是無環鏈表。轉換後的題目,就變成了求解鍊錶2是否存在環,是不是很熟悉?

時間複雜度:m+n

繼承自題目6,同樣是2個思路:

a.如果第6題採用了思路a,那麼找到相同的位置,即為第乙個相交的點。

b.如果第6題採用了思路b,那麼就轉換成了題目2。

如果按照無環鏈表的方式進行遍歷,當將環迴圈一次之後,一定會遇到環中的元素迴圈重複遍歷的情況。因此,對於有環鏈表的遍歷,關鍵還是處理好環的入口指標,保證入口指標及時中斷即可。

尋找環鏈表入口點 快慢指標數學原理剖析

鍊錶環路檢測及環入口定位是乙個非常經典的演算法問題,它可在死鎖檢測等實際應用場景發揮重要作用。想必大家都知道這個問題應該使用快慢指標去求解,因為它具有最優的時間複雜度o n 但是大家可能對快慢指標的數學原理不是很清楚,為啥它能達到最優。詳細讀了這篇文章,大家必定豁然開朗,掌握快慢指標背後的數學原理。...

鍊錶有環問題及入環節點數學原理解析

先上 下面這段 僅判斷乙個鍊錶是否有環,有環的話,單鏈表的形狀只可能是 o 型或者是 p 型 class node public class circle node fast head.next.next 為什麼起始值得先跑一步或者兩步了,因為迴圈的條件是快慢指標不等 node slow head....

九連環 九連環中的數學原理

九連環作為我國民間玩具,以金屬絲製成9個圓環,將圓環套裝在橫板或各式框架上,並貫以環柄。遊戲時,按照一定的程式反覆操作,可使9個圓環分別解開,或合而為一。九連環 現已成為一種國際性的益智遊戲,國內外都有學者在研究,拆解九連環的過程中也蘊含著一些數學原理。2.如圖二所示,如果某乙個環在上面的環杆上,而...