跳到主要内容

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 缓存中维护访问顺序。
  • 队列、任务调度等需要频繁移动元素的位置。

如果只是普通顺序存储和遍历,切片通常更简单,局部性和性能也更好。