在 go 語言中,將列表使用 container/list 包來實現,內部的實現原理是雙鏈表。列表能夠高效地進行任意位置的元素插入和刪除操作。
list 的初始化有兩種方法:new 和宣告。兩種方法的初始化效果都是一致的。
通過 container/list 包的 new 方法初始化 list
變數名 := list.new()
通過宣告初始化list
var 變數名 list.list
列表與切片和 map 不同的是,列表並沒有具體元素型別的限制。因此,列表的元素可以是任意型別。這既帶來便利,也會引來一些問題。給乙個列表放入了非期望型別的值,在取出值後,將 inte***ce{} 轉換為期望型別時將會發生宕機。
雙鏈表支援從佇列前方或後方插入元素,分別對應的方法是 pushfront 和 pushback
提示這兩個方法都會返回乙個 *list.element 結構。如果在以後的使用中需要刪除插入的元素,則只能通過 *list.element 配合 remove() 方法進行刪除,這種方法可以讓刪除更加效率化,也是雙鏈表特性之一。
下面**展示如何給list新增元素:
l := list.new()
l.pushback("fist")
l.pushfront(67)
**說明如下:
type list struct
因為在定義list資料結構的時候,就定義了乙個root頭節點。所以此時,可以很方便的實現頭插入和尾插入。考慮能夠同時插入多個/乙個node節點,利用go中的變長引數實現該特性。對插入的node節點進行迴圈處理,新節點的指標域和root節點的指標域做相應改變,具體實現方式以及說明在**中說明:
func (l *list) pushfront(elements ...inte***ce{}) // 注釋一
n.next = l.root.next // 新節點的next是root節點的next
n.prev = &l.root // 新節點的prev儲存的是root的位址
l.root.next.prev = n // 原來root節點的next的prev是新節點
l.root.next = n // 頭插法 root 之後始終是新節點
l.length++ // list 長度加1
}}
列表的插入函式的返回值會提供乙個 *list.element 結構,這個結構記錄著列表元素的值及和其他節點之間的關係等資訊。從列表中刪除元素時,需要用到這個結構進行快速刪除。
列表操作元素:
package main
import "container/list"
func main()
**說明如下:
遍歷雙鏈表需要配合 front() 函式獲取頭元素,遍歷時只要元素不為空就可以繼續進行。每一次遍歷呼叫元素的 next,如**中第 9 行所示。
l := list.new()
// 尾部新增
l.pushback("canon")
// 頭部新增
l.pushfront(67)
for i := l.front(); i != nil; i = i.next()
**輸出如下:
67
canon
**說明如下: 3 13 Go語言list(列表)
列表是一種非連續的儲存容器,由多個節點組成,節點通過一些變數記錄彼此之間的關係,列表有多種實現方法,如單鏈表 雙鏈表等。列表的原理可以這樣理解 假設 a b c 三個人都有 號碼,如果 a 把號碼告訴給 b,b 把號碼告訴給 c,這個過程就建立了乙個單鏈表結構,如下圖所示。圖 三人單向通知 號碼形成...
R語言列表list函式
列表是r語言中的物件,它包含不同型別的元素,比如 數字,字串,向量和另乙個列表等。乙個列表還可以包含乙個矩陣或乙個函式作為它的元素。使用list 函式建立列表。下面是乙個例子來建立乙個包含字串,數字,向量和邏輯值的列表 create a list containing strings,numbers...
rraylist引數 R語言列表list函式
列表是r語言中的物件,它包含不同型別的元素,比如 數字,字串,向量和另乙個列表等。乙個列表還可以包含乙個矩陣或乙個函式作為它的元素。使用list 函式建立列表。建立乙個列表 下面是乙個例子來建立乙個包含字串,數字,向量和邏輯值的列表 create a list containing strings,...