列表是一种非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系,列表有多种实现方法,如单链表、双链表等。
## 初始化列表
list的初始化有两种方法:两种方法的初始化效果都是一致的。
* 使用New()函数:通过container/list包中的New()函数初始化list
变量名 := list.New()
* var关键字声明
var 变量名 list.List
列表与切片和map不同的是,列表没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来了一些问题,例如给列表中放入一个interface{}类型的值,取出值后,若要将interface{}转换为其他类型将会发生宕机。
## 在列表中插入元素
双链表支持从队列前方或后方插入元素,分别对应的方法是PushFront和PushBack。
提示:
这两个方法都会返回一个*list.Element结构,若在以后的使用中需要删除插入的元素,则只能通过*list.Element配置Remove()方法进行删除,这种方法可以让删除更加效率化。同时也是双链表特性之一。
| 方法 | 功能 |
| --- | --- |
| PushFront(v interface{}) *Element | 在链表的前方插入元素 |
| PushBack(v interface{}) *Element | 在链表的后方插入元素 |
| InsertBefore(v interface{}, mark *Element) *Element | 在mark点之前插入元素,mark点由其他插入函数提供 |
| InsertAfter(v interface{}, mark *Element) *Element | 在mark点之后插入元素,mark点由其他插入函数提供 |
| PushFrontList(other *list) | 添加other列表元素到头部 |
| PushBackList(other *list) | 添加other列表元素到尾部 |
## 列表中删除元素
列表插入函数的返回值会提供一个*list.Element结构,这个结构记录着列表元素的值以及其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。
```
package main
import "container/list"
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 头部添加
l.PushFront(67)
// 尾部添加之后保存元素句柄
element := l.PushBack("first")
// 在first之后添加high
l.InsertAfter("high", element)
// 在first之前添加noon
l.InsertBefore("noon", element)
// 删除
l.Remove(element)
}
```
## 遍历列表,访问列表的每一个元素
遍历双链表需要配置Front()函数获取头元素,遍历时只要元素不为空就可以继续进行,每次遍历都会调用元素的Next()函数,代码如下:
```
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
// 尾部添加
l.PushBack("canon")
// 头部添加
l.PushFront(67)
for item := l.Front(); item != nill; item = item.Next() {
fmt.Println(item.Value)
}
}
```
- 1.Go语言前景
- 2.Go语言环境搭建
- 3.Go语言的基本语法
- 3.1变量
- 3.1.1变量声明
- 3.1.2变量初始化
- 3.1.3多个变量同时赋值
- 3.1.4匿名变量
- 3.1.5变量的作用域
- 3.1.6整型
- 3.1.7浮点类型
- 3.1.8复数
- 3.1.9bool类型
- 3.1.10字符串
- 3.1.11字符类型
- 3.1.12类型转换
- 3.2常量
- 3.1.1const关键字
- 3.2.2模拟枚举
- 4.Go语言的流程控制
- 4.2循环结构
- 4.3键值循环
- 4.4switch语句
- 4.5goto语句
- 4.6break语句
- 4.7continue语句
- 5.Go语言的函数
- 5.1函数声明
- 5.2函数变量
- 5.3函数类型实现接口
- 5.4闭包
- 5.5可变参数
- 5.6defer(延迟执行语句)
- 5.7处理运行时错误
- 5.8宕机(panic)
- 5.9宕机恢复(recover)
- 5.10Test功能测试函数
- 6.Go语言的内置容器
- 6.1数组
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go语言的结构体
- 8.Go语言的接口
- 9.Go语言的常用内置包
- 10.Go语言的并发
- 11.Go语言的文件I/O操作
- 12.Go语言的网络编程
- 13.Go语言的反射
- 14.Go语言的数据库编程
- 15.Go语言密码学算法
- 16.Go语言的gin框架
- 17.Go语言的网络爬虫
- 18.Go语言的编译和工具链