从零开始学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

posted @ 2019-06-25 23:20  VingB2by  阅读(118)  评论(0编辑  收藏  举报