基本資料結構學習總結 單向鍊錶

2022-08-09 11:57:13 字數 1368 閱讀 2863

①查詢②插入

③刪除(兩種)(1)鍊錶中的環問題

很多演算法都涉及到了鍊錶的環問題,不得不說這些問題很有意思
這個問題就是通過兩個指標,一快一慢,同時從根節點出發,如果最後能相遇,那麼說明有環

這個問題也是通過兩個快慢指標解決的,只不過快指標的速度要是慢指標的兩倍。因為當快指標與慢指標相遇時,快指標是一定比慢指標多走了乙個環的長度!而快指標走過的長度又是慢指標的兩倍,所以我們就可以得到慢指標走過的長度就是環的長度

根據之前的環的長度問題的思考,我們很容易就可以解決環的開始節點這個問題。聯想到之前我們曾經解決的鍊錶的倒數第k個節點問題,這裡我們已經可以求出環的長度,那麼環的開始節點問題不就變成了求鍊錶的倒數第k個節點問題嗎?只不過這裡的k變成了環的長度

(2)鍊錶中某個位置的結點

可能是倒數第k個,也可能是中間節點
鍊錶的長度不遍歷一遍是未知的,這個問題乍一看是需要知道倒數第乙個然後回溯的,這樣可能會遍歷兩遍鍊錶或者需要記憶體記錄。但是我們完全可以利用兩個指標,利用兩個指標的相對位置來解決這個問題。我們可以讓乙個指標先走k步,然後兩個同時走,此時第乙個和第二個之間是相差k步的,然後當快指標走到鍊錶末尾後,慢指標所指的就是和它相差k步的倒數第k個節點

中間節點的意思就是:倒數第一半長度的結點。但是如果先獲得長度,然後利用倒數第k個節點的做法,需要兩次遍歷。一次遍歷其實就可以,因為這裡需要的結點的位置很特殊:中間,如果我們還是使用快慢節點的辦法的話,如何能保證快節點到達末尾時,慢節點是中間位置呢?快節點速度是慢節點的兩倍,快節點一次走兩步,慢節點一次走一步,當快節點到達鍊錶尾時,慢節點的位置就是中間節點的位置。

(3)鍊錶的順序倒置

可能僅僅讓你倒著輸出,但原煉表不動,也可能是讓你把原來的鍊錶倒置
兩種,一種遞迴,一種使用棧。

反轉乙個鍊錶,最原始的想法肯定是儲存好每個結點,然後倒著建立新鍊錶。我們的思路總是想著,因為倒數第乙個要成為第乙個,所以我們要先搞到倒數第乙個結點。這種分解子問題的方法不是最好的,最好的分解這個問題的想法應該是:要翻轉整個鍊錶,完全可以在翻轉好前n-1個節點後,再把第n個節點插入到head。可以看出分解子問題的方式不同,結果也不同。

(4)兩個鍊錶

兩個鍊錶有什麼問題呢?兩個鍊錶的公共節點,兩個排序鍊錶合併為乙個鍊錶
其實就和歸併排序的merge過程差不多了,你可以新建乙個鍊錶, 然後把每一次頭結點的較小者加入這個鍊錶,也可以把鍊錶1作為主鍊錶,把鍊錶2每個元素插入到鍊錶1

這個問題的解法就是利用之前的找倒數第k個節點的思想,可以先求出兩個鍊錶的長度,然後讓長鍊錶指標先走兩個鍊錶的長度差的步數,然後兩個指標一起走,第一次相等就是公共節點。所以我們可以盡可能的用較小的複雜度先求出一些我們可以用的條件,然後利用這些條件更好的解決問題。

基本資料結構單向鍊錶

第一次發文章,謬誤之處請各位大佬指正。單向鍊錶的原理還是很簡單的而且和雙向鍊錶有很多相同之處 而且鍊錶和二叉搜尋樹有著很多聯絡以後我會在二叉搜尋樹的章節中寫一篇將二叉搜尋樹改寫成煉表的文章 只改變指標的指向 一下在 的注釋中寫出鍊錶的實現 include include struct node he...

基本資料結構 鍊錶

鍊錶 鍊錶與陣列的區別是鍊錶中的元素順序是有各物件中的指標決定的,相鄰元素之間在物理記憶體上不一定相鄰。採用鍊錶可以靈活地表示動態集合。鍊錶有單鏈表和雙鏈表及迴圈鍊錶。書中著重介紹了雙鏈表的概念及操作,雙鏈表l的每乙個元素是乙個物件,每個物件包含乙個關鍵字和兩個指標 next和prev。鍊錶的操作包...

基本資料結構 鍊錶

談到鍊錶之前,先說一下線性表。線性表是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存方式,一種是順序儲存結構,另一種是鏈式儲存結構。順序儲存結構就是兩個相鄰的元素在記憶體中也是相鄰的...