列表 (list) 是一种非连续存储的容器,又多个节点组成,节点通过一些变量将彼此串联起来。列表(list)底层常见的数据结构有: 单链表、双链表等。
在Go语言中,列表的实现都在 container/list 包中,内部实现原理是双链表。列表(list)能够方便高效地进行元素的删除、插入操作。
1.初始化list
通过 container/list 包中的 New 方法来初始化 list。
实例:
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
//在头部添加新元素
l.PushFront("北京")
l.PushFront("上海")
l.PushFront("广州")
l.PushFront("深圳")
fmt.Println(l)
// 遍历
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
运行结果:
&{{0xc000100570 0xc0001004e0 <nil> <nil>} 4}
深圳
广州
上海
北京
相比较 map (字典),列表没有具体元素类型的限制,也就是说,你可以添加任意类型到 list 容器中,如字符串 、整型等。这带来了一些便利,但是也存在一些问题:给一个列表添加了非期望类型的值后,在遍历取值时,将 interface{} 转换为期望类型时会发生死机。
2.List的常用API
| 函数 | 说明 |
|---|---|
| PushFront | 在列表头部添加新元素 |
| PushBack | 在列表头部添加新元素 |
| PushFrontList(other *List) | 添加 other 列表中的元素到头部 |
| PushBackList(other *List) | 添加 other 列表中的元素到尾部 |
| InsertAfter(v interface{}, mark Element) Element | 在 mark 点后面插入元素 |
| InsertBefore(v interface{}, mark Element) Element | 在 mark 点前面插入元素 |
实例:
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
l.PushBack("北京")
l.PushBack("上海")
l.PushBack("广州")
l.PushBack("深圳")
fmt.Println(l)
// 遍历
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
运行结果:
&{{0xc0001004e0 0xc000100570 <nil> <nil>} 4}
北京
上海
广州
深圳
List增删改查完整案例:
package main
import (
"container/list"
"fmt"
)
func main() {
l1 := list.New()
l2 := list.New()
l2.PushFront("成都")
l2.PushFront("西安")
l1.PushBack("北京")
l1.PushBack("上海")
l1.PushBack("广州")
l1.PushBack("深圳")
//把列表2所有元素添加到l1头部
l1.PushFrontList(l2)
// 遍历
for i := l1.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
var element *list.Element
for i := l1.Front(); i != nil; i = i.Next() {
if i.Value == "上海" {
element = i
break
}
}
l1.InsertBefore("武汉", element)
println("---------在上海前追加'武汉'-----------")
// 遍历
for i := l1.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
//删除广州
println("---------删除'广州'-----------")
for i := l1.Front(); i != nil; i = i.Next() {
if i.Value == "广州" {
element = i
break
}
}
l1.Remove(element)
// 遍历
for i := l1.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
运行结果:
西安
成都
北京
上海
广州
深圳
---------在上海前追加'武汉'-----------
西安
成都
北京
武汉
上海
广州
深圳
---------删除'广州'-----------
西安
成都
北京
武汉
上海
深圳