引言
顺序表和链表都属于线性表,它们都是用来存储数据的结构。
线性表:零个或多个数据元素的有限序列。
顺序表即表示线性表的顺序存储,链表即表示线性表的链式存储。
顺序表
顺序表:顺序表底层是一个数组,它在逻辑上和物理结构上都是连续的。因为我们可以按照下标进行各种操作,每个元素都是连续存放的。
顺序表查找指定位置的时间复杂度为:O(1)
中间插入、中间删除的时间复杂度为:O(n)
头插、头删的时间复杂度为:O(n)
尾插、尾删的时间复杂度为:O(1)
链表
链表:链表是一个由若干节点组成的结构,它在逻辑上是连续的,但在物理结构上是非连续的,或者说,内存上不是紧挨着的。
链表查找的时间复杂度为:O(n)
链表在找到指定元素的位置后,插入和删除操作的时间复杂度为:O(1)
单链表在插入和删除操作时,需要找到前驱域,这也是较为麻烦的。
而双向链表的插入和删除操作效率就较为高效,因为双向链表中的每个节点不仅存储了后继域,也存储了前驱域。但显然,双向链表是利用了更多的空间换取了时间。
一、两者的优缺点
1. 顺序表的优点
(1)顺序表可以通过索引(下标)快速地访问表中元素
2. 顺序表的缺点
(1)顺序表的插入和删除操作,会使得表中的大量元素进行移动,效率较低。
(2)顺序表在面对扩容问题的时候,比较繁琐。当顺序表放满的时候,我们需要进行扩容。而扩容的大小需要面对不同的情况,选择不同的大小,若扩容的容量较大,那么会使得空间利用率较低;若扩容的容量较小,在后续的代码执行过程中,又需要不断地扩容操作,这使得代码变得更加繁琐。
3. 链表的优点
(1)链表的插入和删除操作的效率较高,可以把通过地址直接改变节点的指向。
(2)链表不需要考虑扩容问题。
4. 链表的缺点
(1)链表在查找元素的时候,执行效率较低,需要从头开始,依次往后找。
二、如何选择
(1)若我们存储数据的时候,在后续的操作中,需要对数据进行频繁查找,很少进行插入和删除操作时,宜采用顺序表。
(2)若我们存储数据的时候,在后续的操作中,我们无法确定数据个数的变化,或者说,数据元素在某次操作中,个数变化较大,宜采用链表,因为链表不需要考虑存储空间大小的问题。