前言
乙個風清月皎的夜晚,小萊獨自在操場漫步。突然乙個熟悉的身影從旁邊經過,小萊定睛一看,這不是心怡很久的女神嗎?小萊快走幾步追上女神後打了個招呼就徑直往前走了(沒出息)。為了加深女神對自己的印象,小萊決定再來一次偶遇(回頭是不可能回頭的)。只見小萊加快了步伐,終於再次偶遇到了自己的女神…
本期主要分為以下幾個部分:
判斷是否有環
環的長度
環的入口
鍊錶長度
畫外音:關於單鏈表知識,回顧。
判斷是否有環
如圖,這是乙個鍊錶存在環的示意圖。
我們如何來判斷是否有環呢?小萊偶遇女神的例子或許對我們有所啟發。
在a點小萊和女神第一次相遇(起點)。
為了再次相遇,小萊在女神保持速度不變的情況下,採取了加(風)快(馳)步(電)伐(掣)的策略。由於操場是個環形,那麼在兩個人一快一慢的場景下必然會再次相遇,於是在b點小萊又遇到了自己的女神。
畫外音:操場上想盡快遇到妹子,橫穿草坪超近道也是可以的哈!
那麼結合到煉表裡如何處理呢?接下來我們的主角就該登場了:
「 快慢指標 」
在鍊錶環的問題中我們常常用快慢指標來進行處理,即設定slow、fast兩個指標變數(slow可以看作女神,fast可以看作小萊):
slow每次走一步,即slow->next;
fast每次走兩步,即fast->next->next;
如果slow和fast相遇的話,即可以判斷當前鍊錶中有環。
**實現:
環的長度
既然知道了鍊錶中有環,那麼如何計算這個環的長度呢?
小萊和女神在b點相遇了,那麼女神按照小萊的軌跡走一遍再回到b點,行走的路程不就是環的長度嗎?
畫外音:真他娘的聰明。
**實現:
p節點用來記錄b點的位置。
環的入口
如圖所示,現在我們想要知道環的入口位置。
假設 a到c的距離為x,c到b的距離為y,環的長度為r。在b點相遇時,女神走的距離為s,那麼小萊的距離則為2s(速度是女神的2倍)。
那麼可以根據:
s = x + y;2s = x + y + n * r;
推導出:
x = n * r - y;
畫外音:n表示相遇時快指標(小萊)比慢指標(女神)多走的環數。
根據這個公式,我們可以設定兩個指標,乙個在相遇點b,乙個在起點a,然後兩個指標同時走(每次走一步),當這兩個指標相遇時,此時的位置即為環的入口點。
鍊錶長度
進行到這裡,鍊錶長度的問題就簡單的多了。
根據前面兩步,我們知道了環的長度r,同時在獲取環的入口時可以計算出起始點到入口的距離x。那麼鍊錶的長度l就很容易得出來了。
鍊錶長度l = 起始點到入口的長度x + 環的長度y
IT面試場上的常見問題
it面試場上的常見問題 問題一 請你自我介紹一下 思路 1 這是面試的必考題目。2 介紹內容要與 個人簡歷 相一致。3 表述方式上盡量口語化。4 要切中要害,不談無關 無用的內容。5 條理要清晰,層次要分明。6 事先最好以文字的形式寫好背熟。問題二 你有什麼業餘愛好?思路 1 業餘愛好能在一定程度上...
約瑟夫環的問題
約瑟夫環問題 假設有n個人 每當數到m的時候 就將第m個人出列 接下來從m 1個人開始從1數去 每當數到m的時候就出列 第一次出列一定是編號為 m n 1 剩下的人開始形成乙個新的約瑟夫環 從編號為m n開始計數 假設 k m n 則新的約瑟夫環為 k k 1 k 2 k 3 n 2 n 1 n 0...
約瑟夫環問題想到的
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。在思考這個題目時,想到了很多,開始時,是考慮使用直接一遍一遍的遍歷,但...