一、数组
1.数组的定义
数组(Array)是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。
简单来说,数组就是由一块连续的内存组成的数据结构。
2.数组的优点
1)由于数组”连续“,决定了它的存储位置是固定的,因此数组的访问速度很快。
3.数组的缺点
1)数组的连续性,导致数组对内存的要求比较高,必须是一块连续的内存。
2)插入和删除的效率比较慢,因为在数组的非尾部位插入或删除一个元素,就要移动之后所有的数据。造成一定性能上的开销。
3)大小固定,不能动态扩展。
4.数组的数据结构,如下图所示:
二、链表
1.链表的定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
由于不是必须按照顺序存储,链表在插入的时候可以达到 O(1) 的复杂度,比顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表相应的时间复杂度分别是 O(logn) 和 O(1)。
简单来说,链表是一个无需连续内存存储的数据结构。
链表有两个属性,一个是元素的值,一个是指针,指向下一个元素的地址。
2.链表的分类
- 单项链表
- 双向链表
- 循环链表
1)单项链表
单项链表包含两个域,一个信息域和一个指针域。除之后一个节点的指针指向一个空值,其余的指针均指向列表中的下一个节点。
单项链表的数据结构,如下图所示:
2)双向链表(双链表)
双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针,这样可以从任意一个节点访问前一个节点,也可以从任意一个节点访问后一个节点。以至整个链表。
双向链表的结构如下图所示:
3)循环链表
循环链表中第一个节点之前就是最后一个节点,反之亦然。循环链表的无边界使得在这样的链表上设计算法会比普通链表更加容易。
循环链表的结构,如下图所示:
3.链表的优点
1)内存利用率高,无需连续的内存空间,即使有内存碎片,也不响应链表的创建。
2)链表的插入和删除的速度快
3)链表大小不固定,可以很方便的进行动态扩展
4.链表的缺点
1)不能随机查找,必须从第一个开始遍历,查找效率比较低。链表查询的时间复杂度是O(n)。
三、数组和链表的操作时间复杂度对比:
四、总结
正常情况下,从头部依次添加元素时,链表和数组的性能差别不大。但当数据初始化完成之后,再次进行插入时,尤其是从头部插入,因为数组要移动之后所有的元素,因此性能要比链表低很多。
但在查询时性能刚好相反,因为链表要遍历查询,所以在中间查询时性能比数组慢很多。
因此,在查询较多的场景中,尽量使用数组。而在添加或删除操作比较多时,应使用链表结构。