如何判斷單鏈表是否存在環(huán)

給定一個(gè)單鏈表,只給出頭指針h:

  1. 如何判斷是否存在環(huán)?
  2. 如何知道環(huán)的長(zhǎng)度?
  3. 如何找出環(huán)的連接點(diǎn)在哪里?
  4. 帶環(huán)鏈表的長(zhǎng)度是多少?

下面我們來(lái)依次分析上面的問題。

如何判斷是否存在環(huán)

這里我們考慮使用快慢指針的方式??熘羔?fast 每次移動(dòng)2個(gè)節(jié)點(diǎn),慢指針 slow 每次移動(dòng)一個(gè)節(jié)點(diǎn)。如果沒有環(huán),則 fast 指針將碰到 null,如果有環(huán),則 fast 會(huì)在若干次移動(dòng)后追上 slow。

為什么呢?假定單鏈表的長(zhǎng)度為n,并且該單鏈表是環(huán)狀的,那么第i次迭代時(shí),p指向元素i mod n,q指向2i mod n。因此當(dāng)i≡2i(mod n)時(shí),p與q相遇。而i≡2i(mod n) => (2i - i) mod n = 0 => i mod n = 0 => 當(dāng)i=n時(shí),p與q相遇。

那么當(dāng)p與q起點(diǎn)不同呢?假定第i次迭代時(shí)p指向元素i mod n,q指向k+2i mod n,其中0<k<n。那么i≡(2i+k)(mod n) => (i+k) mod n = 0 => 當(dāng)i=n-k時(shí),p與q相遇。

如何知道環(huán)的長(zhǎng)度

由上一部分的分析我們可以知道,當(dāng)起點(diǎn)相同時(shí),i 等于 n 時(shí)兩者會(huì)再次相遇,所以從相遇點(diǎn)開始,快慢指針再次相遇時(shí)經(jīng)過(guò)的步驟數(shù)為環(huán)的長(zhǎng)度。

如何找出環(huán)的連接點(diǎn)在哪里

假設(shè)第一個(gè)在環(huán)里的節(jié)點(diǎn)為節(jié)點(diǎn) k,那么由上面的分析知道,滿節(jié)點(diǎn)到達(dá) k 節(jié)點(diǎn)時(shí),快節(jié)點(diǎn)已經(jīng)領(lǐng)先了慢節(jié)點(diǎn) k mod n,所以相遇點(diǎn)在 i = n - k 處。這樣,一個(gè)節(jié)點(diǎn)從相遇點(diǎn)開始,一個(gè)節(jié)點(diǎn)從頭結(jié)點(diǎn)開始,以相同的速度行走,最終,經(jīng)過(guò)k步,一個(gè)剛好從到達(dá)n,即回到了起點(diǎn)處,另外一個(gè)到達(dá)了 k,即起點(diǎn)處。

帶環(huán)鏈表的長(zhǎng)度是多少

已經(jīng)知道了環(huán)的長(zhǎng)度和環(huán)的入口,可以計(jì)算出鏈表的長(zhǎng)度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • include<iostream> using namespace std; //單鏈表 typedef stru...
    jmychou閱讀 501評(píng)論 0 0
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,758評(píng)論 1 31
  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,652評(píng)論 0 6
  • 9.3.3 快速排序 ??快速排序?qū)⒃瓟?shù)組劃分為兩個(gè)子數(shù)組,第一個(gè)子數(shù)組中元素小于等于某個(gè)邊界值,第二個(gè)子數(shù)組中的...
    RichardJieChen閱讀 1,949評(píng)論 0 3
  • 當(dāng)我看到那些冰毒的時(shí)候 我就會(huì)想起我的女兒 我在寄人籬下的家里被剝奪撫養(yǎng)權(quán) 只有另一個(gè)女人會(huì)帶她來(lái)看我 當(dāng)我去搶錢...
    一首詩(shī)和小H閱讀 207評(píng)論 2 3

友情鏈接更多精彩內(nèi)容