Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
86 lines (61 sloc) 2.78 KB

使用 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 
You can’t perform that action at this time.