判斷單鏈表中是否存在環及查詢環的入口點

2021-06-08 23:53:46 字數 1138 閱讀 1961

問題1:如何判斷單鏈表中是否存在環(即上圖中從結點e到結點r組成的環)?

解答:設一快一慢兩個指標(node *fast, *low)同時從鍊錶起點開始遍歷,其中快指標每次移動長度為2,慢指標則為1。則若無環,開始遍歷之後fast不可能與low重合,且fast或fast->next最終必然到達null;若有環,則fast必然不遲於low先進入環,且由於fast移動步長為2,low移動步長為1,則在low進入環後繼續繞環遍歷一周之前fast必然能與low重合(且必然是第一次重合)。於是函式可寫如下:

// 若有環,encounter是fast與low重合的地方

bool hascircle(node* head, node* &encounter)

}// fast == null || fast->next == null

encounter = null;

return false;

}問題2:若存在環,如何找到環的入口點(即上圖中的結點e)?

解答:如圖中所示,設鏈起點到環入口點間的距離為x,環入口點到問題1中fast與low重合點的距離為y,又設在fast與low重合時fast已繞環n周(n>0),且此時low移動總長度為s,則fast移動總長度為2s,環的長度為r。則

s + nr = 2s,n>0       ①

s = x + y                   ②

由①式得

s = nr                 

代入②式得

nr = x + y

x = nr - y                   ③

現讓一指標p1從鍊錶起點處開始遍歷,指標p2從encounter處開始遍歷,且p1和p2移動步長均為1。則當p1移動x步即到達環的入口點,由③式可知,此時p2也已移動x步即nr - y步。由於p2是從encounter處開始移動,故p2移動nr步是移回到了encounter處,再退y步則是到了環的入口點。也即,當p1移動x步第一次到達環的入口點時,p2也恰好到達了該入口點。於是函式可寫如下:

node* findentry(node* head, node* encounter)

return p1;}

單鏈表中判斷是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?擴充套件 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點。有乙個單鏈表,其中可能有乙個環,也就是某個節點...

判斷單鏈表中是否存在環

1 使用快慢指標 慢指標每次移動乙個結點,快指標每次移動兩個結點,快指標移動的快,必將先進入環,待慢指標移動進環內,就有點像追及問題了,快指標移動的快,當 p1 p2 時,就說明快慢指標相遇了,即鍊錶有環。懶得畫圖,就描述一下算了。bool hascycle listnode head return...

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...