3 13 Go語言list(列表)

2021-10-06 02:38:29 字數 3076 閱讀 5433

列表是一種非連續的儲存容器,由多個節點組成,節點通過一些變數記錄彼此之間的關係,列表有多種實現方法,如單鏈表、雙鏈表等。

列表的原理可以這樣理解:假設 a、b、c 三個人都有**號碼,如果 a 把號碼告訴給 b,b 把號碼告訴給 c,這個過程就建立了乙個單鏈表結構,如下圖所示。

圖:三人單向通知**號碼形成單鏈表結構

如果在這個基礎上,再從 c 開始將自己的號碼告訴給自己所知道號碼的主人,這樣就形成了雙鏈表結構,如下圖所示。

圖:三人相互通知**號碼形成雙鏈表結構

那麼如果需要獲得所有人的號碼,只需要從 a 或者 c 開始,要求他們將自己的號碼發出來,然後再通知下乙個人如此迴圈,這樣就構成了乙個列表遍歷的過程。

如果 b 換號碼了,他需要通知 a 和 c,將自己的號碼移除,這個過程就是列表元素的刪除操作,如下圖所示。

圖:從雙鏈表中刪除一人的**號碼

在go語言中,列表使用 container/list 包來實現,內部的實現原理是雙鏈表,列表能夠高效地進行任意位置的元素插入和刪除操作。

初始化列表

list 的初始化有兩種方法:分別是使用 new() 函式和 var 關鍵字宣告,兩種方法的初始化效果都是一致的。

通過 container/list 包的 new() 函式初始化 list

變數名 := list.

new(

)

通過 var 關鍵字宣告初始化 list

var 變數名 list.list
列表與切片和 map 不同的是,列表並沒有具體元素型別的限制,因此,列表的元素可以是任意型別,這既帶來了便利,也引來一些問題,例如給列表中放入了乙個 inte***ce{} 型別的值,取出值後,如果要將 inte***ce{} 轉換為其他型別將會發生宕機。

在列表中插入元素

雙鏈表支援從佇列前方或後方插入元素,分別對應的方法是 pushfront 和 pushback。

提示這兩個方法都會返回乙個 *list.element 結構,如果在以後的使用中需要刪除插入的元素,則只能通過 *list.element 配合 remove() 方法進行刪除,這種方法可以讓刪除更加效率化,同時也是雙鏈表特性之一。

下面**展示如何給 list 新增元素:

l := list.

new()l.

pushback

("fist")l.

pushfront(67

)

**說明如下:

第 1 行,建立乙個列表例項。

第 3 行,將 fist 字串插入到列表的尾部,此時列表是空的,插入後只有乙個元素。

第 4 行,將數值 67 放入列表,此時,列表中已經存在 fist 元素,67 這個元素將被放在 fist 的前面。

列表插入元素的方法如下表所示。

從列表中刪除元素

列表插入函式的返回值會提供乙個 *list.element 結構,這個結構記錄著列表元素的值以及與其他節點之間的關係等資訊,從列表中刪除元素時,需要用到這個結構進行快速刪除。

列表操作元素:

package main

import

"container/list"

func

main()

**說明如下:

第 6 行,建立列表例項。

第 9 行,將字串 canon 插入到列表的尾部。

第 12 行,將數值 67 新增到列表的頭部。

第 15 行,將字串 fist 插入到列表的尾部,並將這個元素的內部結構儲存到 element 變數中。

第 18 行,使用 element 變數,在 element 的位置後面插入 high 字串。

第 21 行,使用 element 變數,在 element 的位置前面插入 noon 字串。

第 24 行,移除 element 變數對應的元素。

下表中展示了每次操作後列表的實際元素情況。

遍歷列表——訪問列表的每乙個元素

遍歷雙鏈表需要配合 front() 函式獲取頭元素,遍歷時只要元素不為空就可以繼續進行,每一次遍歷都會呼叫元素的 next() 函式,**如下所示。

l := list.

new(

)// 尾部新增

l.pushback

("canon"

)// 頭部新增

l.pushfront(67

)for i := l.

front()

; i !=

nil; i = i.

next()

**輸出如下:

67

canon

**說明如下:

第 1 行,建立乙個列表例項。

第 4 行,將 canon 放入列表尾部。

第 7 行,在佇列頭部放入 67。

第 9 行,使用 for 語句進行遍歷,其中 i:=l.front() 表示初始賦值,只會在一開始執行一次,每次迴圈會進行一次 i != nil 語句判斷,如果返回 false,表示退出迴圈,反之則會執行 i = i.next()。

第 10 行,使用遍歷返回的 *list.element 的 value 成員取得放入列表時的原值。

go語言列表list

在 go 語言中,將列表使用 container list 包來實現,內部的實現原理是雙鏈表。列表能夠高效地進行任意位置的元素插入和刪除操作。list 的初始化有兩種方法 new 和宣告。兩種方法的初始化效果都是一致的。通過 container list 包的 new 方法初始化 list 變數名 ...

R語言列表list函式

列表是r語言中的物件,它包含不同型別的元素,比如 數字,字串,向量和另乙個列表等。乙個列表還可以包含乙個矩陣或乙個函式作為它的元素。使用list 函式建立列表。下面是乙個例子來建立乙個包含字串,數字,向量和邏輯值的列表 create a list containing strings,numbers...

rraylist引數 R語言列表list函式

列表是r語言中的物件,它包含不同型別的元素,比如 數字,字串,向量和另乙個列表等。乙個列表還可以包含乙個矩陣或乙個函式作為它的元素。使用list 函式建立列表。建立乙個列表 下面是乙個例子來建立乙個包含字串,數字,向量和邏輯值的列表 create a list containing strings,...