go 鏈表中環(huán)的監(jiān)測

注:詳細代碼到https://github.com/go-snail/arithmetic/tree/master/link下載援奢。

鏈表中環(huán)的監(jiān)測

1、判斷是否存在環(huán)

通過快慢指針方式哄尔。slow和fast叶洞,初始化slow=fast=head鳖擒,循環(huán)執(zhí)行以下操作slow = slow.next,fast = fast.next.next,判斷slow == fast粘驰,若slow == fast烤黍,記交點為p漠吻,則存在環(huán)赵誓,否則不存在打毛。

2、求取環(huán)的長度

從p開始執(zhí)行以下操作slow=slow.next,fast=fast.next,再次相交時俩功,執(zhí)行的操作數(shù)幻枉,即為環(huán)的長度。

3诡蜓、找出環(huán)的連接點

如果單鏈表有環(huán)熬甫,按照方法二的思路,走得快的指針fast若與走的慢的指針slow相遇時蔓罚,slow指針肯定沒有遍歷完鏈表椿肩,而fast指針已經(jīng)在環(huán)內(nèi)循環(huán)了n圈(n>=1)。假設(shè)slow指針走了s步豺谈,則fast指針走了2s步(fast步數(shù)還等于s加上在環(huán)上多轉(zhuǎn)的n圈)郑象,設(shè)環(huán)廠為r,則滿足如下關(guān)系表達式:

2s = s + nr 推導(dǎo)出s=nr

設(shè)整個鏈表長為L茬末,入口環(huán)與相遇點b距離為b厂榛,起點到環(huán)入口點的距離為a。則滿足如下關(guān)系表達式:

r = L-a

a+b = s = nr = (n-1)*r+r = (n-1)*r+L-a 推導(dǎo)出a = (n-1)r+(L-a-b)

如上面的圖可得知丽惭,L-a-b為相遇點b到環(huán)入口點的距離击奶,從鏈表頭到環(huán)入口點a的距離a等于n-1循環(huán)內(nèi)環(huán)+相遇點到環(huán)入口點的距離。于是從鏈表頭與相遇點分別設(shè)一個指針责掏,每次各走一步正歼,兩個指針必定相遇,且相遇第一點為環(huán)的入口點拷橘。

編碼如下:

type chainNodestruct {

????num????int

? ? next *chainNode

}

var gc =make(map[*chainNode]int, 0)

func NewChainNode() *chainNode {

????return &chainNode{0, nil}

}

func (l *chainNode)ListChain() {

????for l.next != nil && gc[l.next] ==0 {

????gc[l.next] =1

? ? ?fmt.Printf(" %d", l.next.num)

????l = l.next

????}

}

func (pHead *chainNode)CreateChain() {

var temp *chainNode

var a *chainNode

for i :=1; i <=7; i++ {

temp = NewChainNode()

temp.num = i

pHead.next = temp

pHead = pHead.next

if i ==4 {

a = temp

}

}

temp.next = a

}

func (pHead *chainNode)Checkloop()? {

var fast =? pHead.next

var slow = pHead.next

slow = slow.next

fast = fast.next.next

for slow != fast && fast != nil && slow != nil {

fast = fast.next.next

slow = slow.next

}

fmt.Println("交點b:", fast.num)

slow = slow.next

len1 :=1

? //fast不動局义,slow繼續(xù)走再次相等則為環(huán)的長度

? for slow != fast {

slow = slow.next

len1++

}

fmt.Println("This length of cycle is:", len1)

//求長度

? len2 :=0

? slow = pHead.next

for slow != fast {

fast = fast.next

slow = slow.next

len2 ++

}

fmt.Println("This length of chain is:", len1 + len2)

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喜爷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萄唇,更是在濱河造成了極大的恐慌檩帐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件另萤,死亡現(xiàn)場離奇詭異湃密,居然都是意外死亡,警方通過查閱死者的電腦和手機四敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門泛源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忿危,你說我怎么就攤上這事达箍。” “怎么了铺厨?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵缎玫,是天一觀的道長。 經(jīng)常有香客問我解滓,道長赃磨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任洼裤,我火速辦了婚禮邻辉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腮鞍。我一直安慰自己恩沛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布缕减。 她就那樣靜靜地躺著,像睡著了一般芒珠。 火紅的嫁衣襯著肌膚如雪桥狡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天皱卓,我揣著相機與錄音裹芝,去河邊找鬼。 笑死娜汁,一個胖子當(dāng)著我的面吹牛嫂易,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掐禁,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怜械,長吁一口氣:“原來是場噩夢啊……” “哼颅和!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缕允,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤峡扩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后障本,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體教届,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年驾霜,在試婚紗的時候發(fā)現(xiàn)自己被綠了案训。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粪糙,死狀恐怖强霎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猜旬,我是刑警寧澤脆栋,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站洒擦,受9級特大地震影響椿争,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熟嫩,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一秦踪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掸茅,春花似錦椅邓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逗鸣,卻和暖如春合住,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撒璧。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工透葛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卿樱。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓僚害,卻偏偏與公主長得像,于是被迫代替她去往敵國和親繁调。 傳聞我的和親對象是個殘疾皇子萨蚕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容