資料結構與演算法筆記3

2021-10-09 14:43:04 字數 1866 閱讀 9488

鍊錶

陣列和鍊錶:

從底層儲存結構上來看:陣列需要一段連續的記憶體空間來儲存資料,堆記憶體的要求比較高;鍊錶恰恰相反,他不用連續的一段記憶體,它可以通過指標指向鍊錶中的下乙個元素的位置,從而來進行新增刪除等操作。

單鏈錶鏈表通過指標將一組零散的記憶體塊串聯在一起,吧記憶體塊稱為鍊錶的結點,為了可以找到鍊錶的結點的下乙個結點,所以每個結點中所儲存的除去值之外還有下乙個節點的位址,我們把這個記錄下乙個結點位址的指標叫做後繼指標next。單鏈表中的第乙個結點就是頭結點,最後乙個結點就叫做尾結點,頭結點記錄了整個鍊錶的基位址,而尾結點指向乙個空位址,表示這是鍊錶上的最後乙個結點。

鍊錶的插入和刪除

在某個節點的後邊插入乙個元素,就是將此節點的指標指向被插入的節點的位址,被插入節點的指標在指向原有的節點的位址;刪除某個節點後邊的元素,就是把這個節點的指標直接指向下乙個節點的下乙個,這樣就把原來的節點隔過去了,也就使他不在鍊錶上了。插入和刪除操作本身的時間複雜度是o(1).

想要隨機訪問鍊錶中的某個元素就需要乙個乙個向後找,他的時間複雜度為o(n)。

迴圈鍊錶

迴圈鍊錶就是單鏈表原先尾結點的指標是指向null的,但是現在是指向頭結點,這樣就可以得到乙個迴圈鍊錶。對於處理具有環形結構特點的資料是很合適,

雙向鍊錶

雙向鍊錶顧名思義就是每個節點應該有兩個指向的指標,之前是向後指,相對的,現在應該多了乙個向前指的指標,分別叫做前驅指標prev,後繼指標next。

刪除操作存在兩種情況:

刪除結點中「值等於某個給定值的結點」:這種情況和之前提到的一樣,先找到相應元素的結點,然後再進行刪除操作;

刪除給定指標指向的結點:刪除某個節點q需要知道其前驅結點,而單鏈表沒有前驅結點,雙向鍊錶中儲存了前驅結點的指標,就可以直接找到他之前的元素進行操作。

雙向迴圈鍊錶

理解指標的含義

將某個變數賦值給指標,實際上就是將這個變數的位址賦值給指標,或者反過來說,指標中儲存了這個變數的記憶體位址,指向了這個變數,通過指標就能夠找到這個變數。p->next = q,這個意思是p結點中的next指標儲存了q結點的記憶體位址;另乙個p->next = p->next->next,指的是p節點的next指標儲存了p結點的下下個節點的記憶體位址。

警惕記憶體的丟失

插入節點時一定要注意操作的順序,要先將插入結點x的next指標指向下乙個結點,然後再把前乙個結點的next指標指向插入結點;刪除節點時要注意釋放記憶體空間

利用哨兵簡化實現難度

對於鍊錶來說對頭指標、為指標的操作會出現特殊情況,向空鍊錶插入乙個結點;以及刪除尾結點,這兩種情況都與之前的插入刪除操作的邏輯是不一樣的,可以利用哨兵解決邊緣問題

留意邊界條件的處理

如果鍊錶為空時,如果鍊錶只包含乙個結點時,如果鍊錶只包含兩個結點時**邏輯在處理頭結點和尾結點的時候,是否能正常工作?

舉例畫圖,輔助思考

多練多寫

記住幾個習題,之後有空把這個做一下

單鏈表反轉

鍊錶中環的檢測

兩個有序的鍊錶合併

刪除鍊錶倒數第 n 個結點

求鍊錶的中間結點

棧關於棧,有著後進先出,先進後出的特點,只允許在一端進行插入和刪除操作。

實現乙個棧

對棧的操作主要包括兩個入棧和出棧,在棧頂插入乙個資料,在棧頂刪除乙個資料。棧可由陣列實現,叫做順序棧、由鍊錶實現,稱為鏈式棧。

時間複雜度,都是在棧頂進行操作,時間複雜度為o(1)

空間複雜度:在進行入棧和出棧操作的過程中基本上只會用到幾個變數,所以他的空間複雜度應該為o(1)

棧在括號匹配中的應用

可以用佔來解決遺傳括號的輸入是否合法,用棧來儲存未匹配的左括號,從左到右依次掃瞄字串當掃瞄到左括號的時候就壓入棧,右括號的時候就需要和棧頂存入的括號進行比較,如果是一對的話就把棧頂的括號出棧,如果不匹配或者棧空了,那麼這一串括號就不合法。

Python資料結構與演算法筆記(3)

problem solving with algorithms and data structure using python 中文版 4 遞迴 遞迴是一種解決問題的方法,將問題分解為更小的子問題,直到得到乙個足夠小的問題可以被很簡單地解決,通常遞迴設計函式呼叫自身。遞迴允許我們編寫優雅的解決方案,...

資料結構與演算法 3

非遞迴 o n logn 示例 mergesort 求陣列最小和問題 求陣列中 每個數左側所有比它小的數的和 的和 求降序對問題 陣列中每個數與其右側比它小的數組成的二元組 上題反過來即可 partition過程 給定乙個陣列arr,和乙個整數num,請把小於num的數放在陣列的左邊,大於num的數...

《資料結構與演算法之美》學習筆記 3 資料結構

陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...