Go List
2021-01-04 本文已影响0人
JunChow520
- 列表(list)是一种非连续的存储容器,列表由多个节点构成,节点之间通过变量记录彼此之间的关系。
- 列表有多种实现方式,常见的比如单链表、双链表...
Go语言中列表使用container/list
包来实现,实现原理是双链表,列表可以实现高效地且在任意位置插入和删除元素操作。
list
列表与slice
切片和map
映射不同之处在于,list
列表没有具体元素类型的限制。因此,list
列表中的元素可以是任意类型的。
list
列表初始化的方式有两种,分别是使用var
关键字和New()
函数来声明,两种声明方式的效果是一致的。
声明
使用var
关键字声明列表
var varname list.List
初始化
list
列表可通过container/list
包中提供的New()
函数来初始化
varname := list.New()
插入元素
list
双链表支持从队列前方或后方插入元素,前方插入使用PushFront()
方法,后方插入使用PushBack()
方法,两个方法均返回一个*list.Element
的结构。
doubleLinkedList := list.New()
doubleLinkedList.PushFront(1)
doubleLinkedList.PushBack("junchow")
for i:=doubleLinkedList.Front(); i!=nil; i=i.Next(){
fmt.Printf("item = %v\n", i.Value)
}
插入元素 | 描述 |
---|---|
InsertAfter(v interface {}, mark * Element) *Element |
在mark 插入点之后插入元素,插入点由插入函数提供。 |
InsertBefore(v interface {}, mark * Element) *Element |
在mark 插入点之前插入元素,插入点由插入函数提供。 |
PushBackList(other *List) |
添加列表元素到尾部 |
PushBeforeList(other *List) |
添加列表元素到头部 |
link := list.New()
link.PushFront(1)
link.PushBack("jc")
ele := link.PushBack("male")
link.InsertAfter("dev", ele)
link.InsertBefore("it", ele)
for i:=link.Front(); i!=nil; i=i.Next(){
fmt.Printf("item = %v\n", i.Value)
}
删除元素
list
列表插入后会返回一个*list.Element
结构,此结构记录着列表元素的值和与其它节点之间的关系信息。当需要删除元素时,需使用此结构来进行实现。
若需要删除插入的元素则只能通过*list.Element
配置Remove()
方法来删除,这种删除的方式更高效,因为这是双链表特性之一。
link := list.New()
link.PushFront(1)
link.PushBack("jc")
ele := link.PushBack("male")
link.InsertAfter("dev", ele)
link.InsertBefore("it", ele)
link.Remove(ele)
for i:=link.Front(); i!=nil; i=i.Next(){
fmt.Printf("item = %v\n", i.Value)
}
遍历列表
使用for
循环遍历双链表需配合Front()
函数获取头元素,遍历时只要元素不为空nil
即可继续,每次遍历都需调用元素的Next()
方法,若需获取元素的值则需访问元素的Value
属性。