定义
链表是一种线性表结构,它使用由指正串联的非连续的内存空间,存储相同类型的数据。
算法
随机访问
不支持
查找节点
type Node struct {
Val int
Next *Node
}
func find(head *Node, target int) *Node {
p := head
for p != nil {
if p.Val == target {
return p
}
}
return nil
}
- 时间复杂度:O(n)
- 时间复杂度:O(1)
删除节点
前提:通过查找算法已经拿到前置指针
func delete(pre *Node) {
pre.Next = pre.Next.Next
}
- 时间复杂度:O(1)
- 时间复杂度:O(1)
插入节点
前提:通过查找算法已经拿到前置指针
func insert(pre *Node, node *Node) {
node.Next = pre.Next
pre.Next = node
}
- 时间复杂度:O(1)
- 时间复杂度:O(1)
优点和缺点
优点
- 天然支持自动扩容
缺点
- 无法支持随机访问
变体
单链表是链表最基本的结构,除此之外常见的链表还有以下几种
- 循环链表
- 双向链表
- 循环双向链表