使用 container/list
在这一小节中将通过 conList.go
中的 Go 代码来阐明如何使用 container/list
包,下面分为三个部分介绍。
container/list
包实现了链表
conList.go
的第一部分包含如下的 Go 代码:
package main
import (
"container/list"
"fmt"
"strconv"
)
func printList(l *list.List) {
for t := l.Back(); t != nil; t = t.Prev() {
fmt.Print(t.Value, " ")
}
fmt.Println()
for t := l.Front(); t != nil; t = t.Next() {
fmt.Print(t.Value, " ")
}
fmt.Println()
}
这里有个函数叫 printList()
,你可以传入一个 list.List
变量作为指针,然后输出其中所有的内容。这段 Go 代码展示了如何以从头到尾和从尾到头的两个方向输出 list.List
中的所有元素。通常,在你的程序中只需要使用其中的一种方式。你可以用Prev()
和 Next()
函数来反向或正向迭代链表中的元素。
conList.go
中的第二个代码段如下:
func main() {
values := list.New()
e1 := values.PushBack("One")
e2 := values.PushBack("Two")
values.PushFront("Three")
values.InsertBefore("Four", e1)
values.InsertAfter("Five", e2)
values.Remove(e2)
values.Remove(e2)
values.InsertAfter("FiveFive", e2)
values.PushBackList(values)
printList(values)
values.Init()
你可以用 list.PushBack()
函数在链表尾部插入对象,也可以使用 list.PushFront()
函数在链表的头部插入对象。这两个函数的返回值都是链表中新插入的对象。如果你想在指定的元素后面插入新的元素,那么可以使用 list.InsertAfter()
函数。类似的,你应该使用 list.InsertBefore()
在指定元素的前面插入新元素,如果指定的元素不存在链表就不会改变。list.PushBackList()
将一个链表的副本插入到另一个链表的后面。list.PushFrontList()
函数将一个链表的副本插入到另一个链表的前面。list.Remove()
函数从链表中删除一个指定的元素。
注意,使用 values.Init()
将会清空一个现有的链表或者初始化一个新的链表。
conList.go
的最后一部分代码如下:
fmt.Printf("After Init(): %v\n", values)
for i := 0; i < 20; i++ {
values.PushFront(strconv.Itoa(i))
}
printList(values)
}
这里使用 for
循环创建了一个新的链表,strconv.Itoa()
函数将整数值转化为一个字符串。
总之,container/list
包中函数的用法很好理解,结果也不出意外。
执行 conList.go
将会生成如下的输出:
$ go run conList.go
Five One Four Three Five One Four Three
Three Four One Five Three Four One Five
After Init(): &{{0xc420074180 0xc420074180 <nil> <nil>} 0}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0