記錄幾道面試題留着之後看

1, 面試題之鏈表問題 - 判斷單鏈表是否有環?

給定一個單鏈表:

  1. 如何判斷單鏈表是否有環?

  2. 如何找出環的連接點在哪裏?

  3. 如何知道環的長度?

答案:

使用追趕的方法,很容易得到環的存在性結論。能夠解決問題1。記下碰撞點P。
從碰撞點P重新開始追趕操作,再次碰撞。中間經過的操作數就是環長。解決問題3。
分別從碰撞點P和鏈表頭,同步地步進掃描,直到碰撞。此次碰撞點就是鏈表連接點。解決問題2。

問題2的證明如下:

鏈表形狀類似數字 6 。
假設甩尾(在環外)長度爲 a(結點個數),環內長度爲 b 。
則總長度(也是總結點數)爲 a+b 。
從頭開始,0 base 編號。
將第 i 步訪問的結點用 S(i) 表示。i = 0, 1 ...
當 i<a 時,S(i)=i ;
當 i≥a 時,S(i)=a+(i-a)%b 。

分析追趕過程。
兩個指針分別前進,假定經過 x 步後,碰撞。則有:S(x)=S(2x)
由環的週期性有:2x=tb+x 。得到 x=tb 。
另,碰撞時,必須在環內,不可能在甩尾段,有 x>=a 。

連接點爲從起點走 a 步,即 S(a)。
S(a) = S(tb+a) = S(x+a)。
得到結論:從碰撞點 x 前進 a 步即爲連接點。

根據假設易知 S(a-1) 在甩尾段,S(a) 在環上,而 S(x+a) 必然在環上。所以可以發生碰撞。
而,同爲前進 a 步,同爲連接點,所以必然發生碰撞。

綜上,從 x 點和從起點同步前進,第一個碰撞點就是連接點。

2, Catalan數的相關問題。

http://baike.baidu.com/view/1154333.htm


3, 如何實現malloc 和 free


發佈了67 篇原創文章 · 獲贊 11 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章