第十章 基本資料結構 鍊錶

2021-09-06 19:16:45 字數 1455 閱讀 5275

鍊錶

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

(1)在單鏈表上插入乙個元素,要求時間複雜度為o(1)。

解答:一般情況在鍊錶中插入一元素是在末尾插入的,這樣需要從頭遍歷一次鍊錶,找到末尾,時間為o(n)。要在o(1)時間插入乙個新節點,可以考慮每次在頭節點後面插入,即每次插入的節點成為鍊錶的第乙個節點。

(2)在單鏈表上刪除乙個給定的節點p,要求時間複雜度為o(1)。

解答:一般情況刪除乙個節點時候,我們需要找到該節點p的前驅節點q,需要對鍊錶進行遍歷,執行時間為o(n-1)。我們可以考慮先將q的後繼節點s的值替換q節點值,然後刪除s即可。如下圖刪除節點q的操作過程:

(3)單鏈表逆置,不允許額外分配儲存空間,不允許遞迴,可以使用臨時變數,執行時間為o(n)。

解答:這個題目在面試筆試中經常碰到,基本思想上將指標逆置。如下圖所示:

(4)遍歷單鏈表一次,找出鍊錶中間節點。

解答:定義兩個指標p和q,初始都指向煉表頭節點。然後開始向後遍歷,p每次移動2步,q移動一步,當p到達末尾的時候,p正好到達了中間位置。

(5)用乙個單鏈表l實現乙個棧,要求push和pop的操作時間為o(1)。

解答:根據棧中元素先進後出的特點,可以在鍊錶的頭部進行插入和刪除操作。

(6)用乙個單鏈表l實現乙個佇列,要求enqueue和dequeue的操作時間為o(1)。

解答:佇列中的元素是先進先出,在單鏈表結構中增加乙個尾指標,資料從尾部插入,從頭部刪除。

3、有根樹的表示

採用鍊錶資料結構來表示樹,書中先降二叉樹的鍊錶表示法,然後拓展到分支數無限制的有根數。先來看看二叉樹的鍊錶表示方法,用域p、left和right來儲存指向二叉樹t中的父親、左孩子和右孩子的指標。如下圖所示:

對於分支數目無限制的有根樹,採用左孩子、右兄弟的表示方法。這樣表示的樹的每個節點都包含有乙個父親指標p,另外兩個指標:

(1)left_child指向節點的最左孩子。

(2)right_sibling指向節點緊右邊的兄弟。

演算法導論第十章 基本資料結構

集合 如同在數學中一樣,集合也是電腦科學的基礎。不過數學上的集合時不變的,而演算法所操作的集合是動態改變的。資料結構這一部分介紹在計算機中表示和操作有窮動態集合的一些基本技術。字典 許多演算法要求能夠將元素插入集合,從集合中刪除元素,以及測試元素是否屬於集合。支援這些操作的動態集合就叫字典。另一些演...

演算法導論第十章 基本資料結構(一)

棧和佇列是動態集合 棧實現的是一種後進先出 lifo,last in first out 佇列實現的是一種先進先出 fifo 棧 stack 棧的操作有兩個,乙個是壓入 push 乙個是彈出 pop 對空棧執行pop操作,會導致乙個錯誤 棧下溢 underflow 如果棧頂元素超出棧的大小,那麼則導...

演算法導論第十章資料結構 雙向鍊錶

看的概念挺朦朧的,沒有明確好雙鏈表到底需要哪些方法,其實針對這種結構應該可以寫很多方法,並沒有什麼特定標準。不過真是只看不練不行啊,一下手各種錯誤,各種溢位 include using namespace std templatestruct node templateclass flist tem...