資料結構與演算法之鍊錶

2021-07-10 02:46:55 字數 2276 閱讀 4738

鍊錶的分類:

(1)單鏈表

頭插法:只需要維護乙個頭結點即可,常用來模擬堆疊;

尾插法:需要維護頭結點和尾結點,常用來模擬佇列。

(2)雙向鍊錶

雙向遍歷,可以用來儲存網頁的歷史記錄等;

(3)迴圈鍊錶

經常出現在面試題中,判斷鍊錶是否有環。

鍊錶的刪除

方式一:維護兩個指標,current(表示當前節點)和previous(表示當前節點的前乙個節點)。當current遍歷到要刪除的元素時,執行previous->next = current->next,並刪除current。在刪除時,需要判斷current是否等於head節點。

方式二:維護乙個二級指標,node ** current和乙個臨時變數entry。刪除時只需要執行*current = entry -> next. 並刪除entry即可,無需判斷是否為head節點。

基於記憶體池的鍊錶

(1)進行頻繁的系統呼叫,會浪費不少時間;

(2)在鍊錶節點分配釋放的過程中會產生很多記憶體碎片,不利於分配整塊記憶體;

(3)可能會導致頻繁的cache缺失;

解決方案:

構造乙個記憶體池,每次插入都從記憶體池中獲取乙個節點,每次刪除都將節點放回記憶體池。這樣做的優點是不存在記憶體碎片,也不進行系統呼叫。

鍊錶的反轉(面試常考)

(1)思路一:在從前往後遍歷的過程中進行反轉。維護三個指標,分別指向當前節點以及當前節點的前後節點。

(2)思路二:將第三個節點到第n個節點,依次逐節點插入到第乙個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。

(3)思路三:遞迴的處理head後面的節點,然後再修改head和head後面節點的指向。

倒序列印鍊錶

(1)遞迴:倒序列印意味著先最後的元素,然後依次往前列印,可以用遞迴實現這個過程。遞迴的列印head後面所有的節點,然後列印head節點。

(2)棧模擬:遞迴使用系統棧(活動記錄),我們可以用stl中的棧來模擬上述遞迴過程。首先順序遍歷一遍鍊錶,將元素放入堆疊,然後依次出棧列印元素。

判斷鍊錶是否有環

(1)如何判斷是否存在環?

解法:設定一對快慢指標,同時從鍊錶的頭開始往前遍歷。慢指標一次前進一步,快指標一次前進兩步,如果有環則兩個指標會相遇。

(2)如何知道環的長度?

解法:記錄下問題(1)的碰撞點,快慢指標再從該位置遍歷一遍環。下次碰撞慢指標走過的距離就是環的長度。

(3)如何找出環的連線點在**?

解法:碰撞點到連線點的距離 = 頭指標到連線點的距離,再次從兩點遍歷即可。

(4)帶環鍊錶的長度是多少?

解法:問題2+問題3.

間接定址的基本概念

間接定址簡單描述就是二級指標的應用。二級指標有三個含義:指向指標的指標、一維陣列、二維陣列。間接定址在此特指其一維陣列的含義。

間接定址是陣列和鍊錶的組合。既保留了陣列的許多優點,又獲得了鍊錶的重要特色。首先,可以根據索引在o(1)的時間內訪問每個元素。其次,可以採用二分在對數時間內對乙個有序表進行搜尋。最後,在諸如插入和刪除操作期間不必對元素進行實際的移動。間接定址使用指標陣列來跟蹤每乙個元素,對元素本身如何分配不設限制(可離散可連續)。

間接定址的應用

(1)記憶體池

自構建等塊記憶體池,每乙個指標分別指向每一塊記憶體的首位址。記憶體池可以避免記憶體碎片和系統呼叫。

(2)雜湊鍊錶

如果指標指向的元素包含next指標,則間接定址變成了雜湊鍊錶。

模擬指標的基本概念

模擬指標簡單描述就是利用陣列的下標當指標。模擬指標的最大用途是解決並查集問題。

(1)實現一:首先構造乙個節點陣列,節點包含兩個域:data和link。link域指向陣列中的其他節點。和間接定址有相似之處。

(2)實現二:陣列只包含link域,可以用來模擬樹。

等價類的定義

定義:假定有乙個具有n個元素的集合u,另有乙個具有r個關係的集合r。如果(a,b)屬於r,則元素a和b是等價的。等價類是指相互等價元素的最大集合。換句話說,將集合u根據關係進行劃分,類內的元素等價,可以看做是一種聚類。

離線等價類:已知n和r,確定所有的等價類。

並查集的基本概念

並查集的操作:

(1)find:查詢元素a和b是否屬於同一類;

(2)union:合併元素a和b所在的類。

並查集的實現:

採用方式二的模擬指標。陣列的下標即表示指標,指標的指向使並查集構成了一棵虛擬的森林。但是並查集不關注每棵樹的形狀以及相互指向關係,只關注最終的根節點以及該樹的元素個數或者高度。

並查集的優化:

可以根據重量規則或者高度規則對並查集的操作進行優化。

資料結構與演算法之鍊錶

線性表 線性表的定義 一些元素的序列,維持著元素之間的線性關係。實現線性表的基本需要是 1 能夠找到表首元素 2 從表裡的任意元素出發,能找到它之後的下乙個元素 基於鏈結技術實現的線性表稱為鍊錶。單鏈表 單鏈表的特點總結如下 1 乙個單鏈表由一些具體的表結點組成 2 每個節點是乙個物件,有自己的標識...

資料結構與演算法之 靜態鍊錶

staticlinkedlist.h 靜態鍊錶 typedef int elemtype define maxsize 20 typedef struct component,staticlinkedlist maxsize define ok 1 define error 0 typedef in...

資料結構與演算法之美 鍊錶

如何優雅的寫出鍊錶 6大學習技巧 一 理解指標或引用的含義1.含義 將某個變數 物件 賦值給指標 引用 實際上就是就是將這個變數 物件 的位址賦值給指標 引用 2.示例 p next q 表示p節點的後繼指標儲存了q節點的記憶體位址。p next p next next 表示p節點的後繼指標儲存了p...