从零开始学Go之容器(四):列表
链表内部的实现原理是双链表,可以高效地进行任意位置的元素插入和删除操作
类似的还有堆heap和环列表ring,声明和初始化的方式是相同的,只是原理以及操作的函数不同,当理解了原理操作也是很简单的。
声明与初始化:
list 的初始化有两种方法:New 和声明。两种方法的初始化效果都是一致的。
变量名 := list.New()
var 变量名 list.List
//通过 container/list 包的 New 方法初始化 list a := list.New() //通过声明初始化list var v list.List
插入元素:
头部插入:PushFront(值)
尾部插入:PushBack(值)
标记点前插入:InsertBefore(值, 标记点)
标记点后插入:InsertAfter(值, 标记点)
标记点是一个指针,通过其他函数(例如Front(),Back(),插入时的返回值等)获取
l := list.New() // 尾部添加 l.PushBack("fist") // 尾部添加 l.PushBack("canon") // 头部添加 l.PushFront(67) // 尾部添加后保存元素句柄 element := l.PushBack("fist") // 修改元素句柄为67 element = l.Front() // 在fist之前添加noon l.InsertBefore("noon", element) // 在fist之后添加high l.InsertAfter("high", element)
删除元素:
Remove(标记点)
func main() { l := list.New() // 尾部添加 l.PushBack("fist") // 尾部添加 l.PushBack("canon") // 头部添加 l.PushFront(67) // 尾部添加后保存元素句柄 element := l.PushBack("fist") // 修改元素句柄为67 element = l.Front() // 在fist之前添加noon l.InsertBefore("noon", element) // 在fist之后添加high l.InsertAfter("high", element) // 删除67 l.Remove(element) }
列表遍历:
通过Front()和Back()可以获取列表的头和尾的指针
func main() { l := list.New() l.PushBack("canon") l.PushFront(67) for i := l.Front(); i != nil; i = i.Next() { fmt.Println(i.Value) } }
运行结果
67
canon