算法小知识--9.27-- 简述链表与数组

71 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

关于链表和数组的话,学习了一些皮毛,自己也总结了一点,略略做个笔记

链表和数组都是基于线性的数据结构:

  • 数组在内存的存储是连续的,数组的查询是随机访问,只需要下标的就可以查询了,即 arr[i] = ?

  • 链表是线性的,每一个节点都指向了下一个节点,并且有一个data变量存储当前节点的数据,(如果是双向链表还会有一个指向前一个节点的指针)

  • 数组的优势是查询快,更适合于读操作多,写操作少的场景;根据时间复杂度去计算,查找只需要O(1)

  • 链表是写操作更快,灵活地插入+删除;

  • 在时间复杂度方面,以删除为例:

    • 在找到指定的位置前,数组和链表都需要遍历去找出位置,所以在找出位置的时间复杂度都是O(n)
    • 在不算找的基础上,数组的删除,需要前移后移(取决于删除哪个位置),时间复杂度都是O(n)
    • 链表的删除只需要删除节点,并把上一个节点的指针指向下一个节点或者null,时间复杂度都是O(1)
  • 在越界方面,因为数组的长度是固定的,容易发生越界,这也是我们在业务开发中较为常见的抛错;链表的话,只要可以申请到链空间,就不会存在越界风险。

  • 在空间复杂度上,当要求存储的大小变化不大时,且可以事先确定大小的时候,可以采用数组存储数据;当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储