golang 列表
程序员文章站
2022-05-29 21:02:12
...
1.介绍
-
非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系
-
实现方式 :链表
-
注意
这个最好先别看,因为暂时用不到,最好补充一下数据结构的链表再来看,就通了
2.实现
-
container / list 包来实现
-
原理是双向链表
-
结构体
-
element
type Element struct { // The value stored with this element. Value interface{} // contains filtered or unexported fields }
-
list
type List struct { // contains filtered or unexported fields }
-
3.节点操作
查询
-
前一个
// Next returns the next list element or nil. func (e *Element) Next() *Element
-
前一个
// Prev returns the previous list element or nil. func (e *Element) Prev() *Element
4.链表操作
初始化
// var
var 变量名 list.List
// new()
// func New() *List
变量名 := list.New()
-
注意
- 列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型
- 问题:给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。
增加
-
添加元素
-
数据前插
// 在 mark 点之后插入元素,mark 点由其他插入函数提供 func (l *List) InsertBefore(v interface{}, mark *Element) *Element // 插入失败 mark 不是列表的元素
-
数据后插
// 在 mark 点之后插入元素,mark 点由其他插入函数提供 func (l *List) InsertAfter(v interface{}, mark *Element) *Element // 插入失败 mark 不是列表的元素
-
表尾添加
func (l *List) PushFront(v interface{}) *Element
-
表尾添加元素
func (l *List) PushBack(v interface{}) *Element
-
-
添加列表
-
表尾添加
func (l *List) PushBackList(other *List)
-
表头添加
func (l *List) PushFrontList(other *List)
-
删除
func (l *List) Remove(e *Element) interface{}
移动
-
后移
- 将 e 移动到 mark 后面
func (l *List) MoveAfter(e, mark *Element) //以下情况不移动 如果 e 或者 mark 不存在 如果 e == mark
-
后移
- 将 e 移动到 mark 前面
func (l *List) MoveBefore(e, mark *Element) //以下情况不移动 如果 e 或者 mark 不存在 如果 e == mark
-
移动至列表最后面
- 将 e 移动到 列表 最后面
func (l *List) MoveToBack(e *Element) //以下情况不移动 如果 e 不存在
-
移动至列表最前面
- 将 e 移动到 列表 最前面
func (l *List) MoveToFront(e *Element) //以下情况不移动 如果 e 不存在
查询
-
查第一个节点
func (l *List) Front() *Element // 查询 最后一个元素 // 没有元素返回 nil
-
最后一个节点
func (l *List) Back() *Element // 查询 第一个元素 // 没有元素返回 nil
-
查询长度
func (l *List) Len() int
清空
- 回收链表、清空链表
func (l *List) Init() *List
遍历
for e := l.Front(); e != nil; e = e.Next() {
// do something with e.Value
}
参看
1. http://docscn.studygolang.com/pkg/container/list/