面試題 單鏈表帶環問題

2021-09-30 14:29:42 字數 1084 閱讀 3855

關於單鏈表帶環問題:1、怎樣判斷乙個單鏈表是否帶環;        

2、如果帶環,環的長度怎麼計算;

3、如果帶環,怎麼求環的入口;

1、怎樣判斷乙個單鏈表是否帶環:我們知道,單鏈表如果帶環,那麼從煉表頭開始遍歷就會進入死迴圈。其實我們可以用上篇部落格中提到的兩個指標移動的思想來求解,在這裡可以讓兩個指標移動速度不同,首先令兩個指標fast和slow同時指向鍊錶頭部,然後每次使fast走兩步(fast和slow不規定必須走幾步,只要fast比slow走的快就可以),使slow走一步,只要鍊錶中有環,那麼fast和slow總會相遇。

2、如果帶環,環的長度怎麼計算:首先利用1我們可以得到fast和slow的第一次相遇,把它標記起來,給乙個變數length,讓它初始為0,然後繼續讓fast和slow向後走,每走一次length加一,等到它們再次相遇的時候,得到的length就是環的長度。

3、如果帶環,怎麼求環的入口:同樣利用1得到fast和slow第一次相遇,然後分別在煉表頭和相遇點各設乙個指標,兩個指標每次都向後走一步,再次相遇的點(相遇的第乙個點)就是環的入口點。

下面我用一張圖來模擬一下判斷是否帶環時指標移動的過程,後面兩個問題大家可以自己畫圖驗證一下,看能不能得到想要的結果。

下面附上**:

bool isloop(node* phead)        //判斷乙個鍊錶是否帶環

if(fast != null && fast->_next != null)

return true;

else

return false;

}size_t looplength(node* phead) //求鍊錶中環的長度

if(firstmeeting)

length++;

} return length; }

node* findloopentrance(node* phead) //求環的入口點

} while(1)

return slow;

}

單鏈表面試題 鍊錶帶環問題

判斷單鏈表是否帶環,並求得相遇點 思路 快慢指標問題,前面已經講過快慢指標原理,在這裡不再詳細描述 當快指標比慢指標多走一步,在某個環內一定會相遇在某一點 反過來則有 當兩個快慢指標在某一點相遇,這個鍊錶一定是帶環的鍊錶,反之不帶環 具體過程如圖 具體 鍊錶是否帶環 並返回相遇點 slistnode...

單鏈表帶環問題

判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?1 2 3 4 5 6 7 8 9 不帶環 鍊錶遍歷一次,到最後的節點的下乙個節點會指向null,此時鍊錶不帶環。帶環 在判斷鍊錶是否帶環之前,應該先判斷鍊錶是否為空。空鍊錶肯定不帶環。只要鍊錶帶環,對鍊錶進行遍歷就會形成死迴圈,沒有出口。這是就...

有關單鏈表帶環的問題

1.檢查鍊錶是否帶環,若帶求長度,環入口點。設定兩個快慢指標開始時指向起始位置,開始出發,如果這兩個指標相交,那麼存在環 從交點出發,當再次回到此點便可統計環長度 對與於環入口點,假設快指標每次走兩個位置,慢一直走乙個,如圖所示 則只需乙個從起始點,乙個從交點移動,必會相交。2.檢查兩煉表否相交 鍊...