> ## Documentation Index
> Fetch the complete documentation index at: https://docs.0907world.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 第 2 章 线性表

本章重点复习线性表这一基础数据结构，包括其逻辑结构特征，以及在计算机中两种截然不同的物理实现：顺序表与链表重点在于掌握不同存储结构下各种基本操作的时间复杂度差异及适用场景

## 线性表的定义

<AccordionGroup>
  <Accordion title="基本概念与特征">
    * **表中元素的个数有限**
    * 表中元素具有逻辑上的顺序性，均为数据元素，数据类型都相同，具有抽象性

    <Info>
      **背景说明**：在稍微复杂的线性表中，一个数据元素可以由若干个数据项组成，常把数据元素称为**记录**，含有大量记录的线性表又称为**文件**
    </Info>

    <Tip>
      **结论**：线性表是一种**逻辑结构**，表示元素之间一对一的相邻关系
    </Tip>
  </Accordion>
</AccordionGroup>

## 线性表的表示

### 顺序表

<AccordionGroup>
  <Accordion title="定义与结构图示">
    <Tip>**核心特征**：逻辑顺序与其物理存储顺序完全一致</Tip>

    <img src="https://mintcdn.com/0907/yO7weug7l78KOEtX/images/data-structure/seq-list.svg?fit=max&auto=format&n=yO7weug7l78KOEtX&q=85&s=050e56e4b58bbfb284aab98f7cce469e" alt="顺序表" width="99" height="212" data-path="images/data-structure/seq-list.svg" />
  </Accordion>

  <Accordion title="优缺点对比">
    <Columns>
      <Column>
        **主要优点**

        * 可进行随机访问，按索引查找速度快
        * 存储密度高，不需要额外指针空间
      </Column>

      <Column>
        **主要缺点**

        * 插入和删除操作效率较低，需要移动大量元素
        * 要求分配连续的存储空间，可能产生空间浪费或溢出
      </Column>
    </Columns>
  </Accordion>

  <Accordion title="基本操作与时间复杂度">
    * **初始化**：静态分配或动态分配
    * **插入操作**：
      * 最好情况：在尾部插入，$O(1)$
      * 最坏情况：在表头插入，$O(n)$
      * 平均情况：$O(n)$
    * **删除操作**：
      * 最好情况：删除表尾元素，$O(1)$
      * 最坏情况：删除表头元素，$O(n)$
      * 平均情况：$O(n)$
    * **查找操作**：
      * 按值查找：$O(n)$
      * 按索引查找：$O(1)$
  </Accordion>

  <Accordion title="常见算法题型（参考王道）">
    * **双指针**：如王道 P20 05
    * **倒置**：如王道 P20 07、10
    * **Boyer–Moore 投票算法**：如王道 P20 12
    * **空间换时间**：如王道 P21 13
  </Accordion>
</AccordionGroup>

### 链表

<AccordionGroup>
  <Accordion title="定义">
    <Info>
      数据元素的存储映像称为**结点**，其中存储数据元素信息的域称为**数据域**，存储直接后继存储位置的域称为**指针域**
    </Info>
  </Accordion>

  <Accordion title="各类链表及操作复杂度">
    <Tabs>
      <Tab title="单链表">
        <img src="https://mintcdn.com/0907/yO7weug7l78KOEtX/images/data-structure/singly-linked-list.svg?fit=max&auto=format&n=yO7weug7l78KOEtX&q=85&s=5ea7a2d91bc25d578e2dbced9159d4b7" alt="单链表" width="460" height="148" data-path="images/data-structure/singly-linked-list.svg" />

        * **求表长操作**：$O(n)$
        * **按序号查找节点**：$O(n)$
        * **按值查找表节点**：$O(n)$
        * **插入节点操作**（含查找）：$O(n)$
        * **删除节点操作**（含查找）：$O(n)$
        * **头插法建立单链表**：$O(n)$
        * **尾插法建立单链表**：$O(n)$
      </Tab>

      <Tab title="循环链表">
        <img src="https://mintcdn.com/0907/yO7weug7l78KOEtX/images/data-structure/circular-linked-list.svg?fit=max&auto=format&n=yO7weug7l78KOEtX&q=85&s=beca6dbb0a0f37f58ef48986e7f1f311" alt="循环链表" width="460" height="148" data-path="images/data-structure/circular-linked-list.svg" />

        尾结点的指针域指向头结点，形成环状结构适合处理需要反复遍历的场景
      </Tab>

      <Tab title="双向链表">
        <img src="https://mintcdn.com/0907/yO7weug7l78KOEtX/images/data-structure/doubly-linked-list.svg?fit=max&auto=format&n=yO7weug7l78KOEtX&q=85&s=f56591879c72f0c488822f4ab8c822a5" alt="双向链表" width="563" height="259" data-path="images/data-structure/doubly-linked-list.svg" />

        每个结点包含两个指针域，分别指向前驱和后继可以双向遍历，在已知结点位置时，插入和删除操作更为高效
      </Tab>

      <Tab title="静态链表">
        <img src="https://mintcdn.com/0907/yO7weug7l78KOEtX/images/data-structure/static-linked-list.svg?fit=max&auto=format&n=yO7weug7l78KOEtX&q=85&s=72bbc36b7fe4a576c726e41da70ce113" alt="静态链表" width="183" height="197" data-path="images/data-structure/static-linked-list.svg" />

        借用一维数组来描述线性链表

        * 含备用链
        * 不含备用链
      </Tab>
    </Tabs>
  </Accordion>

  <Accordion title="常见算法题型（参考王道）">
    * **快慢指针**：用于找中点、判环等如王道 P44 15、16、17、20
    * **公共节点**：求两个链表的交点如王道 P43 05、P45 18
    * **空间换时间**：如王道 P45 19
  </Accordion>
</AccordionGroup>
