数组与链表
数组
数组的优劣和操作的时间复杂度
优点:更新查找快,由于数组是线性查存储,所以我们只需要给到我们想要的元素下标,就可以方便的更新元素和查找元素。
缺点:增删慢,还是因为数组的线性存储,举个比较简单的例子,比如说我们的书桌上堆放着一摞书,我想要拿第 5 本,
我需要动前 4 本才可以拿到想要的。如果书我想把一本书放在中间位置,同样需要动中间位置之前的所有书才可以。
数组时间复杂度
由于更新查找的时候只需要提供下标,所以时间复杂度是O(1)。增加和删除的时候需要改动数组中的其他元素,所以时间复杂度是O(n)。
链表
链表定义
- 链表是线性结构;
- 链表的存储方式是不连续的,是将零散的内存块串联起来;
- 每个内存块成为节点 Node,除了存储数据,还需要存储指向下一个内存块的指针;
- 存储方式为:以 head 为头节点,头结点可以不存放任何数据,它是链表的开始,指向链表中第一个节点,而每个节点都有一个 next 的向下引用,指向下一个节点,直到最后一个节点。每一个节点由两部分组成,包括 data(存放数据),next(指向下一个节点)。
图片描述
链表内部
- 首元结点:就是指链表中存储第一个数据元素的结点;
- 头节点:它是在首元结点之前附设的一个节点,其指针指向首元结点;
- 头指针:指向链表中的第一个结点的指针。
链表与数组对比
| 类型 | 增删 | 随机访问 | 缺点 |
|---|---|---|---|
| 数组 | O(n) | O(1) | 需申请连续空间,若连续空间不足则会申请失败; 大小固定,空间不足需扩容的情况下需要进行数据复制 |
| 链表 | O(1) | O(n) | 占用内存空间过大,需要额外保存指针; 增删频繁的情况下,需要频繁的申请和释放内存,容易产生内存碎片。 |
TIPS:
- 链表增删只需要改变指针指向。所以复杂度为O(1)O(1)
- 随机访问需要每次都从头开始遍历。所以复杂度为O(n)O(n)
- 访问操作 > 增删操作 — 数组;
- 访问操作 < 增删操作 — 链表。

浙公网安备 33010602011771号