list

container/list 是 Go 标准库中实现​​双向链表​​的包,它提供了高效的插入和删除操作,特别适合需要频繁在首尾修改元素的场景。

container/list 作为 Go 标准库中的重要数据结构,为开发者提供了简洁高效的非线程安全双向链表实现。虽然在随机访问方面不如 slice,但在处理需要频繁插入、删除的队列式数据时,其 O(1) 的操作复杂度使其成为无可替代的选择。

特性
list
slice
map

首部插入

​O(1)​

O(n)

不支持

中间插入

O(1)

O(n)

不支持

随机访问

O(n)

​O(1)​

​O(1)​

内存占用

中等 (每个元素额外16字节)

元素有序性

保持插入顺序

保持索引顺序

无序

1 Element

// Element 表示双向链表中的一个节点
type Element struct {
    next, prev *Element // 前后节点指针
    list       *List    // 所属链表
    Value      any      // 存储的实际值
}

1.1 func (e *Element) Next() *Element

功能说明

  • 返回当前元素的下一个元素

  • 如果当前元素是尾元素或者不属于任何链表,则返回 nil

返回值

  • *Element: 下一个链表节点指针

  • 无错误返回

使用注意事项

  1. ​空链表调用​​:当元素不属于任何链表时返回 nil

  2. ​尾元素处理​​:尾元素的 Next() 必然返回 nil

  3. ​并发安全​​:遍历时可能被其他协程修改,需加锁

1.2 func (e *Element) Prev() *Element

功能说明

  • 返回当前元素的前一个元素

  • 如果当前元素是首元素或者不属于任何链表,则返回 nil

返回值

  • *Element: 前一个链表节点指针

  • 无错误返回

使用注意事项

  1. ​空链表调用​​:当元素不属于任何链表时返回 nil

  2. ​首元素处理​​:首元素的 Prev() 必然返回 nil

  3. ​环形链表模拟​​:当用于环形结构时需手动连接首尾

2 List

​作用​​:提供双向链表数据结构实现,支持高效的头尾操作和任意位置插入删除。

2.1 func New() *List

功能​​:创建并初始化一个新的空链表 ​​返回值​​:新链表指针

2.2 func (l *List) Back() *Element

功能​​:返回链表最后一个元素 ​​返回值​​:尾元素指针(链表为空时返回 nil) ​​注意事项​​:

  • 空链表调用返回 nil

  • 修改尾元素需使用链表方法(如 MoveToBack)

2.3 func (l *List) Front() *Element

功能​​:返回链表第一个元素 ​​返回值​​:首元素指针(链表为空时返回 nil)

2.4 func (l *List) Init() *List

功能​​:重置链表为空状态(O(1)时间) ​​返回值​​:当前链表指针(便于链式调用) ​​注意事项​​:

  • 不会回收元素内存(可能需手动清空引用)

  • 被移除的元素仍可能被外部引用

2.5 func (l *List) InsertAfter(v any, mark *Element) *Element

参数​​:

  • v:插入的值

  • mark:参照元素(新元素插入在其后)

​返回值​​:新元素指针(无效操作时返回 nil) ​​注意事项​​:

  • mark 必须属于当前链表

  • 插入位置必须在链表内

2.6 func (l *List) InsertBefore(v any, mark *Element) *Element

类似 InsertAfter,但插入在 mark 元素之前

2.7 func (l *List) Len() int

功能​​:返回链表长度 ​​返回值​​:当前元素数量(≥0) ​​特性​​:复杂度 O(1)

2.8 func (l *List) MoveAfter(e, mark *Element)

功能​​:将元素 e 移动到 mark 之后 ​​参数​​:

  • e:要移动的元素

  • mark:目标位置元素

​注意事项​​:

  • 两元素必须属于同一链表

  • e 和 mark 不能为同一元素

  • 操作后原位置元素自动连接

2.9 func (l *List) MoveBefore(e, mark *Element)

类似 MoveAfter,但移动到 mark 元素之前

2.10 func (l *List) MoveToBack(e *Element)

功能​​:移动元素到链表尾部 ​​注意事项​​:

  • 元素必须属于当前链表

  • 移动尾元素无实际效果但允许操作

2.11 func (l *List) MoveToFront(e *Element)

类似 MoveToBack,但移动到头部

2.12 func (l *List) PushBack(v any) *Element

功能​​:尾部添加元素(O(1)) ​​返回值​​:新元素指针

2.13 func (l *List) PushBackList(other *List)

功能​​:将另一链表所有元素添加到当前链表尾部 ​​注意事项​​:

  • other 链表会被清空(元素移动)

  • 添加后两个链表互不影响

2.14 func (l *List) PushFront(v any) *Element

类似 PushBack,但在头部添加

2.15 func (l *List) PushFrontList(other *List)

类似 PushBackList,但添加到头部

2.16 func (l *List) Remove(e *Element) any

功能​​:移除链表中的元素 ​​参数​​:要移除的元素指针 ​​返回值​​:被移除元素的值 ​​错误情况​​:

  • 如果 e 为 nil:panic("list: Remove called on nil Element")

  • 如果 e 不属于当前链表:panic("list: Remove called on element not in list")

​注意事项​​:

  • 移除后该元素不再属于链表

  • 仍可访问该元素的值,但不应再用于链表操作

操作
时间复杂度
解释

PushFront/PushBack

O(1)

常数时间完成

InsertBefore/After

O(1)

修改指针即可

MoveToFront/Back

O(1)

直接调整指针

Remove

O(1)

解除节点链接

按索引访问

O(n)

需要顺序遍历

查找元素

O(n)

需要顺序遍历

最后更新于