Go 语言 list (列表)_初始化_遍历_删除

发布于: 2020-11-20 17:35:46 作者: 犬小哈 最后修订时间: 2020-11-20 17:35:46

列表 (list) 是一种非连续存储的容器,又多个节点组成,节点通过一些变量将彼此串联起来。列表(list)底层常见的数据结构有: 单链表、双链表等

Go 语言中,列表的实现都在 container/list 包中,内部实现原理是双链表。

列表(list)能够方便高效地进行元素的删除、插入操作。

一、初始化 list (列表)

list 的初始化方法有两种:New 和 声明。两者的效果是一样的.

1.1 通过 container/list 包中的 New 方法来初始化 list

格式如下:

变量名 := list.New()

1.2 通过声明初始化 list

格式如下:

var 变量名 = list.List

PS: 列表和 map (字典) 有什么区别?

相比较 map (字典),列表没有具体元素类型的限制,也就是说,你可以添加任意类型到 list 容器中,如字符串整型等。这带来了一些便利,但是也存在一些问题:给一个列表添加了非期望类型的值后,在取值时,将 interface{} 转换为期望类型时会发生宕机。

二、向 list (列表) 中添加元素

双链表支持往队列前面或后面添加元素,对应的方法分别是:

  • PushFront
  • PushBack

示例代码如下:

l := list.New()

l.PushFront("犬小哈教程")
l.PushBack("www.quanxiaoha.com")

关于 list (列表) 插入元素的方法,如下表所示:

方法功能
InsertAfter(v interface{}, mark *Element) *Element在 mark 点后面插入元素
InsertBefore(v interface{}, mark *Element) *Element在 mark 点前面插入元素
PushFrontList(other *List)添加 other 列表中的元素到头部
PushBackList(other *List)添加 other 列表中的元素到尾部

三、从 list (列表) 中删除元素

list (列表) 的插入函数的返回值是一个 *list.Element 结构,通过它来完成对列表元素的删除:

package main

import (
	"container/list"
)

func main()  {
	l := list.New()

	// 头部添加字符串
	l.PushFront("犬小哈教程")
	
	// 尾部添加字符串
	l.PushBack("www.quanxiaoha.com")

	// 尾部添加一个整型,并保持元素句柄
	element := l.PushBack(1)
	
	// 在 1 之后添加字符串 2
	l.InsertAfter("2", element)

	// 在 1 之前添加字符串 0
	l.InsertBefore("0", element)
	
	// 删除 element 对应的元素
	l.Remove(element)
}

最终队列中保存的元素有:

犬小哈教程 www.quanxiaoha.com 0 2

四、遍历 list (列表)

遍历 list (列表) 需要搭配 Front() 函数获取头元素,遍历过程中,只要元素不为空则可继续调用 Next 函数往下遍历:

package main

import (
	"container/list"
	"fmt"
)

func main()  {
	l := list.New()

	// 头部添加字符串
	l.PushFront("犬小哈教程")

	// 尾部添加字符串
	l.PushBack("www.quanxiaoha.com")

	// 遍历
	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Println(i.Value)
	}
}

注意,在 for 语句遍历中:

  • 其中 i := l.Front() 表示初始赋值,用来获取列表的头部下标;
  • 然后每次会循环会判断 i != nil,若等于空,则会退出循环,否则执行 i.Next()继续循环下一个元素;

代码输出如下:

犬小哈教程
www.quanxiaoha.com

图示:

go语言遍历list列表代码示例