- 列表(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属性。
7590

被折叠的 条评论
为什么被折叠?



