演算法面試題 帶環鍊錶之靈魂三問!

2021-10-04 21:24:03 字數 1255 閱讀 1117

今天舍友二狗子又去面試了,回來就問我們演算法問題,看來對於ios開發來說演算法是乙個大難題啊!

今天是什麼呢?當然是帶環鍊錶的問題了。

這就讓我想起了當初的帶環鍊錶三連問!現場慌的不行不行的。

一句話解釋:使用快慢指標,同時指向頭節點,slow指標每次走乙個節點,fast指標每次走兩個節點,最終如果兩個指標相遇,則表示有環!

第一問很簡單,第二問就有點難度了,哈哈!當初栽過跟頭了,都是淚~

假設:快慢指標都從環的入口開始走,那麼在慢指標跑一圈,快指標跑兩圈的時候,兩個指標肯定在入口處相遇;

那麼:如果快慢指標從煉表頭開始走的話呢?當兩個指標相遇的時候,就表示:快指標走的距離 = n個環的距離 + 慢指標走的距離環的長度=相遇點和入口兩段的距離慢指標走的距離可以簡化為:鍊錶開頭到環入口+環入口到相遇點的距離

結論:鍊錶入口到環入口距離 = n個環的長度+慢指標到環入口距離,那麼慢指標到環入口距離==鍊錶入口到環入口距離,只要快指標指向鍊錶入口,和慢指標同步移動,再次相遇的節點就是環的入口節點;(success)

這個是在第二步的基礎上計算的,只要找到環的入口,走一遍就可以算出長度了!

#include

#include

struct node

;void

initlist

(struct node *listhead)

intmain()

}// 2. 尋找環的入口

fast = listhead;

for(;;

)printf

("enter address: %p, value: %d \r\n"

, slow, slow->num)

;// 3. 計算環的長度

int i =0;

fast = slow->next;

for(i=

1; fast!=slow; i++

) fast = fast->next;

printf

("length: %d\r\n"

, i)

;return0;

}

——2020-04-09——

單鏈表面試題系列之帶環鍊錶的入口點

本篇博文闡述如何找到帶環鍊錶的入口點,那麼,首先有必要闡述一下什麼是帶環鍊錶?如何判斷鍊錶是否帶環?帶環鍊錶 即鍊錶中有迴圈的部分,通俗的說就是沒有尾節點!例如 判斷鍊錶是否帶環 那麼知道了什麼是帶環鍊錶,接下來就是判斷鍊錶是否帶環的判斷問題了,其實也很簡單,首先最簡單的是判斷出不 帶環的鍊錶,只要...

單鏈表面試題 帶環鍊錶的入口點

昨天做了乙個小總結,發現單鏈表這塊關於帶環鍊錶漏掉了,今天就來總結一下。要尋找乙個單鏈表的環的入口點,首先得判斷乙個鍊錶是否帶環,那麼又怎樣判斷乙個單鏈表是否帶環呢?首先我們得普及一下環有什麼特性,我們知道無環的單鏈表有首節點和尾節點,那麼帶環的單鏈表呢?顯然還是有首節點的,但是沒有尾節點吧。如圖所...

鍊錶的演算法面試題總結

1 單鏈表的建立和遍歷 2 求單鏈表中節點的個數 太簡單,就不寫了 3 查詢單鏈表中的倒數第k個結點 劍指offer,題15 4 查詢單鏈表中的中間結點 5 合併兩個有序的單鏈表,合併之後的鍊錶依然有序 出現頻率高 劍指offer,題17 6 單鏈表的反轉 出現頻率最高 劍指offer,題16 7 ...