鍊錶
鍊錶與陣列的區別是鍊錶中的元素順序是有各物件中的指標決定的,相鄰元素之間在物理記憶體上不一定相鄰。採用鍊錶可以靈活地表示動態集合。鍊錶有單鏈表和雙鏈表及迴圈鍊錶。書中著重介紹了雙鏈表的概念及操作,雙鏈表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指向節點緊右邊的兄弟。
基本資料結構 鍊錶
談到鍊錶之前,先說一下線性表。線性表是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存方式,一種是順序儲存結構,另一種是鏈式儲存結構。順序儲存結構就是兩個相鄰的元素在記憶體中也是相鄰的...
基本資料結構(2) 鍊錶
鍊錶開發於1955 56,由當時所屬於蘭德公司 英語 rand corporation 的艾倫紐維爾 allen newell 克里夫肖 cliff shaw 和赫伯特西蒙 herbert simon 在他們編寫的資訊處理語言 ipl 中做為原始資料型別所編寫。ipl被作者們用來開發幾種早期的人工智...
基本資料結構單向鍊錶
第一次發文章,謬誤之處請各位大佬指正。單向鍊錶的原理還是很簡單的而且和雙向鍊錶有很多相同之處 而且鍊錶和二叉搜尋樹有著很多聯絡以後我會在二叉搜尋樹的章節中寫一篇將二叉搜尋樹改寫成煉表的文章 只改變指標的指向 一下在 的注釋中寫出鍊錶的實現 include include struct node he...