浅谈线性表

155 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

前端能够用得到的数据存储结构之一:线性表

概念

  • 数据元素类型相同(n 个 && n>0)
  • 有限序列
  • 有始有终(唯一的起始点 + 唯一的终止点)
  • 第 2 ~ n 个元素都有直接前驱(唯一的)
  • 第 1 ~ n-1 个元素都有直接后继(唯一的)

存储方式

  • 顺序存储 —— 顺序表
  • 链式存储 —— 链表

顺序表

  • 逻辑上相邻的数据在计算机内的存储位置也是相邻的
  • 存储:连续
  • 优势:
    • 根据索引可以快速查找
    • 操作简单
    • 存储密度高
  • 劣势:
    • 插入/删除时需要将其操作的元素后面的元素全都进行移动
  • 分配空间方法:
    • 静态分配
      • 定长数组存储
      • 最大空间(预先分配一段连续的空间——固定大小)
      • length:元素个数(也称为顺序表的长度)
      • 不足:合并/插入等操作过程中易溢出(超出预分配的空间长度)
    • 动态分配
      • elem 记录分配的空间的基地址(首地址)
      • length:实际元素个数(顺序表的长度)
      • 运算过程如果出现溢出的情况:另找一块更大的空间来代替原来的存储空间(扩充存储空间)
  • 查询操作的时间复杂度: O(1)
  • 插入和删除操作的平均时间复杂度:O(n)

链表

  • 单链表
    • 节点组成:数据域(存储数据元素) + 指针域(下一个节点的地址)
    • 查询:顺序存取 —— 单向操作(从头开始,一个一个地往后找)
    • 插入:
      • [e] -> 插入到 [i-1] 与 [i] 之间
      • p 节点 -> [i-1] -> [i] ;
      • s -> e
      • 步骤
        • s->next = p->next
        • p->next = s
    • 删除
      • [i] -> 从 [i-1][i][i+1] 中删除
      • p 节点 -> [i-1]
      • q 节点 -> [i]
      • 步骤
        • p->next = q->next (原来的[i+1]的节点直接覆盖原来[i]的节点)
  • 双向链表
    • 节点组成:指针域(指向前驱节点) + 数据域(数据元素) + 指针域(指向后继节点)
    • 查询:可以向前,也可以向后
    • 插入:
      • p->pre->next = s
      • s->pre = p->pre
      • s->next = p
      • p->pre = s
    • 删除
      • p->pre->next = p->next
      • p->next->pre = p->pre
      • delete p
  • 循环链表
    • 环状:最后一个节点的后继指向头节点
    • 空表:p->next = p->pre = p
    • 优势:
      • 动态存储,无需预先分配空间
      • 插入删除操作无需移动元素
    • 劣势:
      • 存储密度低
      • 存储元素需从头到尾顺序查找
  • 静态链表
    • [数据] [对应元素的后继下标]
    • 插入
      • 第 i 个元素前插入 89, 数组长度 len
      • data[len] = 89
      • right[i-1] = len , right[len] = i
    • 删除
      • 第 i 个元素
      • right[i-1] = right[i+1] (直接跳过)