6 9 Go語言鍊錶操作

2021-10-06 17:20:19 字數 2609 閱讀 1399

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。

使用鍊錶結構可以避免在使用陣列時需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。

鍊錶允許插入和移除表上任意位置上的結點,但是不允許隨機訪問。鍊錶有三種型別:單向鍊錶、雙向鍊錶以及迴圈鍊錶。

單向鍊錶這裡介紹三個概念:首元結點、頭結點和頭指標。

頭結點在鍊錶中不是必須的,但增加頭結點有以下幾點好處:

使用 struct 定義單鏈表

利用 struct 可以包容多種資料型別的特性,使用它作為鍊錶的結點是最合適不過了。乙個結構體內可以包含若干成員,這些成員可以是基本型別、自定義型別、陣列型別,也可以是指標型別。這裡可以使用指標型別成員來存放下乙個結點的位址。

【示例 1】使用 struct 定義乙個單向鍊錶。

type node struct

其中成員 data 用來存放結點中的有用資料,next 是指標型別的成員,它指向 node struct 型別資料,也就是下乙個結點的資料型別。

【示例 2】為鍊錶賦值,並遍歷鍊錶中的每個結點。

package main

import

"fmt"

type node struct

func

shownode

(p *node)

}func

main()

執行結果如下:

插入結點單鏈表的結點插入方法一般使用頭插法或者尾插法。

1) 頭插法

每次插入在鍊錶的頭部插入結點,**如下所示:

package main

import

"fmt"

type node struct

func

shownode

(p *node)

}func

main()

node.next = tail //將新插入的node的next指向頭結點

tail =

&node //重新賦值頭結點

}shownode

(tail)

//遍歷結果

}

執行結果如下:

2) 尾插法每次插入結點在尾部,這也是我們較為習慣的方法。

package main

import

"fmt"

type node struct

func

shownode

(p *node)

}func

main()

(*tail)

.next =

&node

tail =

&node

}shownode

(head)

//遍歷結果

}

執行結果如下:

在進行陣列的插入、刪除操作時,為了保持記憶體資料的連續性,需要做大量的資料搬移,所以速度較慢。而在鍊錶中插入或者刪除乙個資料,我們並不需要為了保持記憶體的連續性而搬移結點,因為鍊錶的儲存空間本身就不是連續的。所以,在鍊錶中插入和刪除乙個資料是非常快速的。

但是,有利就有弊。鍊錶要想隨機訪問第 k 個元素,就沒有陣列那麼高效了。因為鍊錶中的資料並非連續儲存的,所以無法像陣列那樣,根據首位址和下標,通過定址公式就能直接計算出對應的記憶體位址,而是需要根據指標乙個結點乙個結點地依次遍歷,直到找到相應的結點。

迴圈鍊錶

迴圈鍊錶是一種特殊的單鏈表。

迴圈鍊錶跟單鏈表唯一的區別就在尾結點。單向鍊錶的尾結點指標指向空位址,表示這就是最後的結點了,而迴圈鍊錶的尾結點指標是指向鍊錶的頭結點,它像乙個環一樣首尾相連,所以叫作「迴圈」鍊錶,如下圖所示。

圖:迴圈鍊錶

和單鏈表相比,迴圈鍊錶的優點是從鏈尾到鏈頭比較方便。當要處理的資料具有環型結構特點時,就特別適合採用迴圈鍊錶。比如著名的約瑟夫問題,儘管用單鏈表也可以實現,但是用迴圈鍊錶實現的話,**就會簡潔很多。

雙向鍊錶

單向鍊錶只有乙個方向,結點只有乙個後繼指標 next 指向後面的結點。而雙向鍊錶,顧名思義它支援兩個方向,每個結點不止有乙個後繼指標 next 指向後面的結點,還有乙個前驅指標 prev 指向前面的結點。

圖:雙向鍊錶

雙向鍊錶需要額外的兩個空間來儲存後繼結點和前驅結點的位址。所以,如果儲存同樣多的資料,雙向鍊錶要比單鏈表占用更多的記憶體空間。雖然兩個指標比較浪費儲存空間,但可以支援雙向遍歷,這樣也帶來了雙向鍊錶操作的靈活性。

go語言實現鍊錶

宣告結構體 宣告全域性變數,儲存頭結點 var head node var curr node 宣告節點型別 type node struct 建立頭結點 func createheadnode data string node 新增新節點 func addnode data string node...

Go語言 實現鍊錶

鍊錶是乙個結點指向下乙個結點的儲存結構,每乙個結點有兩個元素,乙個是存放資料本身,另乙個資料指向下乙個結點,由這些結點組成乙個鍊錶 package main import fmt type node struct type nodelist struct func this nodelist add...

1 21 Go之鍊錶操作

定義 鍊錶是物理儲存單元上非連續 非順序的儲存結構 特點 資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 概括 鍊錶是一種資料儲存結構,通過指標指向定義它的鏈結次序。有點像區塊鏈。只不過乙個鍊錶的結構體擁有的元素比區塊鏈的區塊少 鍊錶的每個點稱為節點,乙個節點包括 資料域指標域 鍊錶的優缺點 優...