一条小码农

努力一点,现在想要的未来都会有。

数组与链表

数组


数组的优劣和操作的时间复杂度

优点:更新查找快,由于数组是线性查存储,所以我们只需要给到我们想要的元素下标,就可以方便的更新元素和查找元素。
缺点:增删慢,还是因为数组的线性存储,举个比较简单的例子,比如说我们的书桌上堆放着一摞书,我想要拿第 5 本,
我需要动前 4 本才可以拿到想要的。如果书我想把一本书放在中间位置,同样需要动中间位置之前的所有书才可以。

数组时间复杂度

由于更新查找的时候只需要提供下标,所以时间复杂度是O(1)。增加和删除的时候需要改动数组中的其他元素,所以时间复杂度是O(n)。


链表


链表定义

  1. 链表是线性结构;
  2. 链表的存储方式是不连续的,是将零散的内存块串联起来;
  3. 每个内存块成为节点 Node,除了存储数据,还需要存储指向下一个内存块的指针;
  4. 存储方式为:以 head 为头节点,头结点可以不存放任何数据,它是链表的开始,指向链表中第一个节点,而每个节点都有一个 next 的向下引用,指向下一个节点,直到最后一个节点。每一个节点由两部分组成,包括 data(存放数据),next(指向下一个节点)。
    图片描述

链表内部

  • 首元结点:就是指链表中存储第一个数据元素的结点;
  • 头节点:它是在首元结点之前附设的一个节点,其指针指向首元结点;
  • 头指针:指向链表中的第一个结点的指针。

链表与数组对比


类型 增删 随机访问 缺点
数组 O(n) O(1) 需申请连续空间,若连续空间不足则会申请失败;
大小固定,空间不足需扩容的情况下需要进行数据复制
链表 O(1) O(n) 占用内存空间过大,需要额外保存指针;
增删频繁的情况下,需要频繁的申请和释放内存,容易产生内存碎片。

TIPS:

  • ​链表增删只需要改变指针指向。所以复杂度为O(1)O(1)
  • ​随机访问需要每次都从头开始遍历。所以复杂度为O(n)O(n)
  • 访问操作 > 增删操作 — 数组;
  • 访问操作 < 增删操作 — 链表。
posted @ 2021-07-19 11:00  萝卜的博  阅读(125)  评论(0)    收藏  举报