參考:
http://c.biancheng.net/view/35.html
關(guān)鍵點(diǎn)
列表list內(nèi)部是
雙鏈表
列表能夠
高效
地進(jìn)行任意位置
的元素插入
和刪除
操作
可以通過(guò)
new
和var
進(jìn)行聲明列表
列表的
元素類型
屏轰,沒(méi)有限制
钝鸽,
list的
使用場(chǎng)景
?由
各種類型
的元素 組成時(shí),可以使用列表list
在Go語(yǔ)言中昆淡,列表使用 container/list 包來(lái)實(shí)現(xiàn)勋拟,內(nèi)部的實(shí)現(xiàn)原理是雙鏈表括荡。
1疏遏、初始化列表
list 的初始化有兩種方法:
分別是使用
-
New()
函數(shù) -
var 關(guān)鍵字
聲明,
兩種方法的初始化效果都是一致的目养。
- 通過(guò) container/list 包的
New() 函數(shù)
初始化 list
變量名 := list.New()
- 通過(guò)
var 關(guān)鍵字
聲明初始化 list
var 變量名 list.List
2俩由、列表
與切片和 map
不同的是,
列表并沒(méi)有
具體元素類型
的限制
癌蚁,因此幻梯,列表的元素可以是任意類型
兜畸,這既帶來(lái)了便利,
也引來(lái)一些問(wèn)題礼旅,例如給列表中放入了一個(gè) interface{} 類型的值膳叨,取出值后,
如果要將 interface{}
轉(zhuǎn)換為其他類型
將會(huì)發(fā)生宕機(jī)
痘系。
3菲嘴、在列表中插入
元素
雙鏈表支持從隊(duì)列前方或后方插入元素,分別對(duì)應(yīng)的方法是
- PushFront
- PushBack汰翠。
提示
這兩個(gè)方法都會(huì)返回一個(gè) *list.Element 結(jié)構(gòu)龄坪,如果在以后的使用中需要?jiǎng)h除插入的元素,則只能通過(guò) *list.Element 配合 Remove() 方法進(jìn)行刪除复唤,這種方法可以讓刪除更加效率化健田,同時(shí)也是雙鏈表特性之一。
下面代碼展示如何給 list
l := list.New()
l.PushBack("fist")
l.PushFront(67)
代碼說(shuō)明如下:
- 第 1 行佛纫,創(chuàng)建一個(gè)列表實(shí)例妓局。
- 第 3 行,將 fist 字符串插入到列表的尾部呈宇,此時(shí)列表是空的好爬,插入后只有一個(gè)元素。
- 第 4 行甥啄,將數(shù)值 67 放入列表存炮,此時(shí),列表中已經(jīng)存在 fist 元素蜈漓,67 這個(gè)元素將被放在 fist 的前面穆桂。
4、從列表中刪除
元素
列表插入函數(shù)的返回值會(huì)提供一個(gè) *list.Element 結(jié)構(gòu)融虽,這個(gè)結(jié)構(gòu)記錄著列表元素的值以及與其他節(jié)點(diǎn)之間的關(guān)系等信息享完,從列表中刪除元素時(shí),需要用到這個(gè)結(jié)構(gòu)進(jìn)行快速刪除有额。
列表操作元素:
package main
import "container/list"
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
// 尾部添加后保存元素句柄
element := l.PushBack("fist")
// 在fist之后添加high
l.InsertAfter("high", element)
// 在fist之前添加noon
l.InsertBefore("noon", element)
// 使用
l.Remove(element)
}
代碼說(shuō)明如下:
- 第 6 行驼侠,創(chuàng)建列表實(shí)例。
- 第 9 行谆吴,將字符串 canon 插入到列表的尾部。
- 第 12 行苛预,將數(shù)值 67 添加到列表的頭部句狼。
- 第 15 行,將字符串 fist 插入到列表的尾部热某,并將這個(gè)元素的內(nèi)部結(jié)構(gòu)保存到 element 變量中腻菇。
- 第 18 行胳螟,使用 element 變量,在 element 的位置后面插入 high 字符串筹吐。
- 第 21 行糖耸,使用 element 變量,在 element 的位置前面插入 noon 字符串丘薛。
- 第 24 行嘉竟,移除 element 變量對(duì)應(yīng)的元素。
下表中展示了每次操作后列表的實(shí)際元素情況洋侨。
5舍扰、遍歷列表——訪問(wèn)
列表的每一個(gè)元素
遍歷雙鏈表需要配合 Front() 函數(shù)獲取頭元素,遍歷時(shí)只要元素不為空就可以繼續(xù)進(jìn)行希坚,每一次遍歷都會(huì)調(diào)用元素的 Next() 函數(shù)边苹,代碼如下所示。
l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
代碼輸出如下:
67
canon
代碼說(shuō)明如下:
- 第 1 行裁僧,創(chuàng)建一個(gè)列表實(shí)例个束。
- 第 4 行,將 canon 放入列表尾部聊疲。
- 第 7 行茬底,在隊(duì)列頭部放入 67。
- 第 9 行售睹,使用 for 語(yǔ)句進(jìn)行遍歷桩警,其中 i:=l.Front() 表示初始賦值,只會(huì)在一開始執(zhí)行一次昌妹,每次循環(huán)會(huì)進(jìn)行一次 i != nil 語(yǔ)句判斷捶枢,如果返回 false,表示退出循環(huán)飞崖,反之則會(huì)執(zhí)行 i = i.Next()烂叔。
- 第 10 行,使用遍歷返回的 *list.Element 的 Value 成員取得放入列表時(shí)的原值固歪。