有環單向鍊錶

2021-07-05 11:06:26 字數 775 閱讀 7430

1. 給定單鏈表,檢測是否有環。如果有環,則求出進入環的第乙個節點。

判斷單向鍊錶是否有環,可以採用快指標與慢指標的方式來解決。即定義乙個快指標fast和乙個慢指標slow,使得fast每次跳躍兩個節點,slow每次跳躍乙個節點。如果鍊錶沒有環的話,則slow與fast永遠不會相遇(這裡鍊錶至少有兩個節點);如果有環,則fast與slow將會在環中相遇。判斷出煉表有環以後,則需要算出進入環的第乙個節點。在fast與slow第一次相遇後,設定乙個節點pnode從鍊錶的頭部開始遍歷,每次只遍歷乙個節點。這樣,當fast與slow再次相遇時,pnode所處的位置便是環的首部。

其實很簡單,想象一下在跑道上跑步:兩個速度不同的人在操場跑道上一圈一圈地跑,他們總會有相遇的時候。因此我們只需要準備兩個指標,同時從煉表頭出發,乙個每次往前走一步,另乙個每次往前走兩步。如果鍊錶沒有環,那麼經過一段時間,第二個(速度較快的)指標就會到達終點;但如果鍊錶中有環,兩個指標就會在環裡轉圈,並會在某個時刻相遇。

[cpp]view plain

copy

lnode* getloopnode(lnode* head)  

//定義乙個快指標和乙個慢指標

lnode* fast = head;  

lnode* slow = head;  

while

(fast && (fast->next))  

}  return

slow;  

}  }  

return

null;  

}  

如何判斷單向鍊錶有環?

昨天去面試了一把,面試官給出了這道題。當時我知道一定有什麼巧妙的辦法,但是我並沒有想到。我只是想到了通用的方法,順序遍歷然後為遍歷過的節點依次做標誌。也試圖去想了些特殊的訪法,不過都有一定的侷限性。事後得知了下面這個較優的方案。typedef struct nodetag node 題目 如何判斷單...

單向鍊錶判斷是否有環

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

判斷單向鍊錶是否有環

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