List
Go 标准库的 container/list 提供双向链表,适合频繁在中间位置插入、删除元素的场景。
基础使用
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
l.PushBack("go")
l.PushBack("rust")
l.PushFront("js")
for e := l.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
}
常用方法
l := list.New()
first := l.PushBack("first")
second := l.PushBack("second")
l.InsertBefore("before second", second)
l.InsertAfter("after first", first)
l.MoveToFront(second)
l.Remove(first)
遍历删除
删除元素时先保存下一个节点,避免当前节点被移除后无法继续遍历。
for e := l.Front(); e != nil; {
next := e.Next()
if e.Value == "second" {
l.Remove(e)
}
e = next
}
适用场景
- 需要保存节点引用,并在 O(1) 时间删除节点。
- LRU 缓存中维护访问顺序。
- 队列、任务调度等需要频繁移动元素的位置。
如果只是普通顺序存储和遍历,切片通常更简单,局部性和性能也更好。