链表基础

基本概念

结构:由一系列节点(node)组成的线性序列。

节点:包含两个部分,分别是

  • 数据域:存放实际的数据元素
  • 指针域:存储一个或多个引用,指向其他节点

特性

  • 非物理连续:节点在内存中不必连续存储
  • 动态扩展性:可以快速增加或删除节点
  • 顺序访问性:必须通过指针逐个访问,无法直接定位具体的某个元素

分类

单向链表

  • 每个节点包含一个指向后继(next)节点的指针
  • 终止于一个空指针(nullptr)
  • 只能单向遍历

双向链表

  • 每个节点包含前驱(prev)和后继(next)两个指针
  • 支持双向遍历
  • 需要更多的存储空间(存储前驱指针)

循环链表

  • 尾节点的指针指向头节点,形成环状结构
  • 可分为单向循环和双向循环两种变体
  • 没有明确的开始和结束的概念

数组与链表

数组:存储内存连续,大小固定,可以直接访问某个元素(快),插入删除操作慢

链表:存储内存不连续,大小不固定,不能直接访问某个元素(慢),插入删除操作快

时间复杂度

访问

  • 随机访问:O(n)
  • 顺序访问:O(1)

插入

  • 头插:O(1)
  • 尾插:O(1)(有尾指针时)或O(n)
  • 指定位置插:O(n)查找+O(1)插入

删除

  • 头删:O(1)
  • 尾删:O(1)(双链表)或O(n)(单链表)
  • 指定元素删:O(n)查找+O(1)删除

查找:O(n)