尋找單向環形鍊錶的交點(C語言)

2022-10-08 19:30:16 字數 1622 閱讀 5120

聽說這題還是挺有邏輯性的,我們來看看吧

我們可以利用快慢指標,慢指標每次走一步,快指標每次走兩步,如果這個單向鍊錶無環,則慢指標永遠都追不上快指標;但是如果有環,就必定在某一點上回相遇;

首先快指標一定比慢指標先進環,假設慢指標剛好到環的起點第乙個位置,例如示例中「2」的位置,那麼他們差的距離記作x,按照剛剛的邏輯「慢指標每次走一步,快指標每次走兩步」,x每次就減少一,那麼x作為乙個整數,當x = 0時,慢指標跟快指標差距為0,不就是相遇了。

繼續剛剛的相遇,若相遇,則我們把相遇的點斷開,那麼環就變成了相交的鍊錶,最後我們就可以按照相交鍊錶的求法來解決這個問題

這個方法寫起來複雜,但理解起來很簡單,斷開這個具體的操作就是把相遇點的下乙個節點記錄,然後把相遇點指向null即可,相交鍊錶問題就是長的鍊錶可以先走上兩鍊錶的長度差值步,然後再比較節點位址即可

還是用快慢指標,如果有環必相遇,如果沒環結束。但是這次我們相遇後,讓這個鍊錶的頭結點開始移動,fast/slow指標任意乙個移動,計較,最後必定會走到同乙個點上,而這個點就是我們要找的

這個**好寫,但是理解起來不容易,值得反覆**這個過程。

typedef struct listnode node;

struct listnode *detectcycle(struct listnode *head)

return intersection;}}

return null;//無環

}

如果看完對你有一點啟發,可以點個贊嗎?感謝!

更新2022.3.11

10:17

C語言單向環形鍊錶

include include struct list struct list create pnew next head 最後乙個節點的指標指向head return head struct list insert struct list head,int pos while temp next ...

單向環形鍊錶

問題描述 設編號為 1,2,3,4 n的n個人圍坐一圈,約定編號為第k 1 k n 的那個人,從1開始報數,數到m的那個人出列,它的下一位又開始從1報數,數到m的那個人又出列,依次類推,知道所有人出列為止,由此產生了乙個出隊編號的序列。建立環形鍊錶並且遍歷 實現 public class josep...

單向環形鍊錶

一 單向環形鍊錶的結構 二 單向環形鍊錶的使用場景 josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的...