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

更新时间 2022-03-31 14:58:04

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1800+ 小伙伴加入学习 ,欢迎点击围观

列表 (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列表代码示例go语言遍历list列表代码示例