2021-11-10
列表是一種非連續(xù)的存儲(chǔ)容器誉结,有多個(gè)節(jié)點(diǎn)組成炼鞠,節(jié)點(diǎn)通過(guò)一些變量記錄彼此之間的關(guān)系
單鏈表和雙鏈表就是列表的兩種方法缘滥。
原理:A、B簇搅、C三個(gè)人完域,B懂A的電話,C懂B的電話只是單方知道號(hào)碼瘩将,這樣就形成了一個(gè)單鏈表結(jié)構(gòu)吟税。
如果C把自己的號(hào)碼給B,B把自己的號(hào)碼給A姿现,因?yàn)槭请p方都知道對(duì)方的號(hào)碼肠仪,這樣就形成了一個(gè)雙鏈表結(jié)構(gòu)
如果B換號(hào)碼了,他需要通知AC备典,把自己的號(hào)碼刪了异旧,這個(gè)過(guò)程就是列表的刪除操作。
在Go語(yǔ)言中提佣,列表使用 container/list 包來(lái)實(shí)現(xiàn)吮蛹,內(nèi)部的實(shí)現(xiàn)原理是雙鏈表,列表能夠高效地進(jìn)行任意位置的元素插入和刪除操作拌屏。
初始化列表
列表初始化的兩種辦法
- 通過(guò)container/list包中的New()函數(shù)初始化 list
變量名 :=list.New()</pre>
- 通過(guò)var 聲明初始化 list
var 變量名 list.List
列表沒(méi)有給出具體的元素類型的限制潮针,所以列表的元素可以是任意類型的,
例如給列表中放入了一個(gè) interface{} 類型的值倚喂,取出值后每篷,如果要將 interface{} 轉(zhuǎn)換為其他類型將會(huì)發(fā)生宕機(jī)。
在列表中插入元素
雙鏈表支持從隊(duì)列前方或后方插入元素,分別對(duì)應(yīng)的方法是 PushFront 和 PushBack焦读。
list1 := list.New()
list1.PushBack("firstvalue")
list1.PushFront(98)</pre>
方 法 | 功 能 |
---|---|
InsertAfter(v interface {}, mark * Element) * Element | 在 mark 點(diǎn)之后插入元素子库,mark 點(diǎn)由其他插入函數(shù)提供 |
InsertBefore(v interface {}, mark * Element) *Element | 在 mark 點(diǎn)之前插入元素,mark 點(diǎn)由其他插入函數(shù)提供 |
PushBackList(other *List) | 添加 other 列表元素到尾部 |
PushFrontList(other *List) | 添加 other 列表元素到頭部 |
從列表中刪除元素
列表插入函數(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"
"fmt"
)
func main() {
ListDelete()
}
func ListDelete() {
ListD := list.New()
// 尾部添加
ListD.PushBack("canon")
// 頭部添加
ListD.PushFront(67)
// 尾部添加后保存元素句柄
element := ListD.PushBack("fist")
// 在fist之后添加high
ListD.InsertAfter("high", element)
// 在fist之前添加noon
ListD.InsertBefore("noon", element)
// 使用
ListD.Remove(element)
for i :=ListD.Front();i !=nil;i = i.Next() {
fmt.Println(i.Value)
}
}
操作內(nèi)容 | 列表元素 |
---|---|
l.PushBack("canon") | canon |
l.PushFront(67) | 67, canon |
element := l.PushBack("fist") | 67, canon, fist |
l.InsertAfter("high", element) | 67, canon, fist, high |
l.InsertBefore("noon", element) | 67, canon, noon, fist, high |
l.Remove(element) | 67, canon, noon, high |
遍歷完也能看到最后的結(jié)果
學(xué)習(xí)地址:http://c.biancheng.net/view/35.html