《C專家程式設計》:如何檢測連結串列裡的環(附1)
題目:怎樣才能檢測到連結串列中存在環。
沒有任何條件限制:
方案:使用標記法:將訪問過的元素進行標記(通過修改連結串列的結構),如果遍歷玩連結串列還沒有碰見標記的元素,則說明沒有環,反之則有;O(N)時間複雜度。
資料位於只讀儲存區,不能修改:
方案:空間換時間:申請一個N個元素大小的記憶體空間,用雜湊表將所有的元素儲存起來,看後面的元素有沒有重複的,若有,則存在環;沒有則不存在。時間複雜度為O(N),空間複雜度為O(N)。
沒有足夠的空間:
方案一:使用兩個指標,第一個指標指向第一個資料,第二個指標依次遍歷後面的資料,如果沒有;則第一個指標向後移一個,第二個指標再從第三個元素一次向後查詢遍歷....看是否有相等的資料,若有,則存在環;否則,不存在環。但是此種演算法效率實在低下,O(N*N),泛善可陳,丟掉吧。
所以如果該連結串列可以修改我們可以採取標記法來判斷就可以處理重複的資料了!時間複雜度O(N)。
如果不能修改但是可以申請空間,那麼我們就可以用雜湊表的結構照樣採用標記法來判斷是否有環。時間複雜度為O(N)。
如果既不能修改也不能申請空間,除了設定兩個指標以外,我想我們可以比較地址,但是效率較低O(N*N)!
沒有任何條件限制:
方案:使用標記法:將訪問過的元素進行標記(通過修改連結串列的結構),如果遍歷玩連結串列還沒有碰見標記的元素,則說明沒有環,反之則有;O(N)時間複雜度。
資料位於只讀儲存區,不能修改:
方案:空間換時間:申請一個N個元素大小的記憶體空間,用雜湊表將所有的元素儲存起來,看後面的元素有沒有重複的,若有,則存在環;沒有則不存在。時間複雜度為O(N),空間複雜度為O(N)。
沒有足夠的空間:
方案一:使用兩個指標,第一個指標指向第一個資料,第二個指標依次遍歷後面的資料,如果沒有;則第一個指標向後移一個,第二個指標再從第三個元素一次向後查詢遍歷....看是否有相等的資料,若有,則存在環;否則,不存在環。但是此種演算法效率實在低下,O(N*N),泛善可陳,丟掉吧。
方案二(推薦):還是設定兩個指標。由於連結串列的長度是任意的,所以先看一種特殊的情況:就是有三個元素,其實只有兩個值,第二個元素的下一個就是第一個元素。如果不存在則進行下一步判斷,第一個指標走一步,第二個指標走兩步,這樣如果立案表裡有環,則這兩個指標將深陷此環而永不復出,那麼一個走一步,另一個走兩步,總有一天會相遇,如果存在值相等,則說明有環,否則如果有一個指標走到了連結串列的盡頭,等於NULL,則說明連結串列中五環。時間複雜度為O(N),空間複雜度為0。詳細圖如下:
所以如果該連結串列可以修改我們可以採取標記法來判斷就可以處理重複的資料了!時間複雜度O(N)。
如果不能修改但是可以申請空間,那麼我們就可以用雜湊表的結構照樣採用標記法來判斷是否有環。時間複雜度為O(N)。
如果既不能修改也不能申請空間,除了設定兩個指標以外,我想我們可以比較地址,但是效率較低O(N*N)!
相關文章
- 《C程式設計專家》:程式設計師面試(附2)C程式程式設計師面試
- 《C專家程式設計》:如何用氣壓計測量建築物的高度(附3)程式設計
- C++中的連結串列類的設計C++
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- Linked List Cycle leetcode java (連結串列檢測環)LeetCodeJava
- 雙向連結串列介面設計(C語言)C語言
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- 連結串列面試題(十)---求帶環單連結串列的環的長度面試題
- 【C++ 資料結構:連結串列】二刷LeetCode707設計連結串列C++資料結構LeetCode
- 一篇特別長的總結(C專家程式設計)程式設計
- 《C專家程式設計》讀書筆記(1-3章)程式設計筆記
- Rust 程式設計,用連結串列實現棧Rust程式設計
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 環形連結串列II
- C語言/C++程式設計學習—資料結構—連結串列類的宣告及定義C語言C++程式設計資料結構
- 連結串列專題——面試中常見的連結串列問題面試
- 單向迴圈連結串列介面設計(C語言)C語言
- 單向連結串列介面設計
- 707_設計連結串列
- 程式碼隨想錄第3天 | 連結串列 203.移除連結串列元素,707.設計連結串列,206.反轉連結串列
- 《劍指offer》:[37]如何得到連結串列環的入口地址
- C++建立連結串列C++
- C#集合----連結串列C#
- 環形連結串列_相交連結串列_多數元素(java語言)Java
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- **203.移除連結串列元素****707.設計連結串列****206.反轉連結串列**
- 資料結構_連結串列的原理與應用1_單連結串列(基於C語言實現)資料結構C語言
- 設計單向迴圈連結串列的介面
- JavaScript資料結構之連結串列--設計JavaScript資料結構
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題
- 資料結構與演算法 | 迴文連結串列檢測資料結構演算法
- 寒假專案1-動態連結串列體驗(改造)(1)
- C/C++ 陣列連結串列表示式計算C++陣列
- 約瑟夫環 佇列+連結串列佇列
- 141. 環形連結串列
- (連結串列)連結串列的排序問題排序
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法