判斷單向鍊錶是否有環

2021-09-18 02:10:56 字數 2402 閱讀 2755

找出環的入口點

求環的長度

求環上距離任意一點最遠的點

判斷兩個無環鏈表是否相交

判斷相交的位置

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

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

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

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

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

如何判斷兩個無環鏈表是否相交;

如果相交,求出第乙個相交的節點;

建立兩個指標 fast 和 slow 指向頭結點, 無限迴圈, 每次迴圈 fast 走兩步, slow 走一步. 如果 fast 碰到 null 說明沒有環, 如果 fast 碰到 slow 說明有環.

int

checkloop

(node* head)

}

這是個數學題, 首先要明白:

如果 fast 遇到了 slow, 說明 fast 比 slow 多走了整整 n 圈 ( n >= 1 )

這個理解了之後, 進行數學解答:

設 slow 走了 s

ss 步, 則 fast 走了 2s2s

2s步設圈的長度為lll

因為 fast 比 slow 多走了整整 n 圈, 所以

2 s−

s=s=

l2s - s = s = n \times l

2s−s=s

=n×l

又因為 slow 是從頭結點走到環的入口, 又從環的入口走到了重合點

設環的入口到頭結點的長度為 a

aa, 二者的重合點到圈的入口為 x

xx所以

s =a

+x

s = a + x

s=a+x

所以x+a=

lx + a = n \times l

x+a=n×

l !!! 以下結論很關鍵 !!!

當乙個指標位於環中, 到環的起點的距離是 x

xx 時, 若指標向前移動了 y

yy 步, 那麼它的最終位置到環的起點的距離是 (x+

y)%l

(x+y) \% l

(x+y)%

l

所以當乙個指標位於重合點時, 如果它向前走 a

aa 步, 那麼它的最終位置就是環的起點, 即

( x+

a)%l

=(n×

l)%l

=0

(x + a) \% l = (n \times l) \% l = 0

(x+a)%

l=(n

×l)%

l=0

同時, 若乙個指標從頭結點向前走 a

aa 步, 那麼它的最終位置是環的起點 (因為環的起點到頭結點的距離是 aaa)

所以, 如果兩個指標分別從頭結點和重合點同時向前走, 每次都只走一步, 那麼它們會和的地方就是環的起點

// 檢查是否有環, 如果有環找出重合點

node*

checkloop

(node* head)

}// 計算環入口距離煉表頭結點的距離

intgetpreloop

(node* head)

// 此時 p1 就是入口點

return count;

}

如果 fast 和 slow 重合, 說明 slow 已經位於環中, 那麼令乙個新的指標從重合點的位置一步一步向前走, 最終一定會再和 slow 重合, 而走的步數就是環的長度.

// 檢查是否有環, 如果有環找出重合點

node*

checkloop

(node* head)

}// 計算環的長度

intgetlooplen

(node* head)

return count;

}

顯然, 最遠距離是 flo

or(l

2)

floor(\frac)

floor(

2l​)

兩個指標分別找到兩個鍊錶最後乙個節點, 檢查最後乙個節點是否是一樣的即可.

標準答案是, 將乙個鍊錶的尾巴連線到另乙個鍊錶的頭部, 從而組成乙個帶環的鍊錶, 然後就可以把這個問題轉化為尋找環的入口. 這方法真巧…

如果我們不允許修改鍊錶, 我的想法是:

維護兩個和鍊錶等長的陣列, 記錄兩個指標分別走過的所有節點

然後倒序遍歷兩個陣列, 直到找到兩個不一樣的值, 那麼該值的上乙個值便是相交點.

單向鍊錶判斷是否有環

如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...

判斷單向鍊錶是否有環

若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...

如何判斷單向鍊錶中是否有環

首先遍歷鍊錶,尋找是否有相同位址,藉此判斷鍊錶中是否有環 如果不考慮空間複雜度,可以使用乙個map記錄走過的節點,當遇到第乙個在map中存在的節點時,就說明回到了出發點,即鍊錶有環,同時也找到了環的入口。如果程式進入死迴圈,則需要一塊空間來儲存指標,遍歷新指標時將其和儲存的舊指標比對,若有相同指標,...