数组与链表是两种基本的数据结构,它们都有各自的特点,在存储与数据操作等方面均有所不同。
一、数组
数组是有序的元素序列,由多个相同数据类型的变量组成。数组名即这一组变量集合的命名。
1.1 数组的特点
(1)使用数组需要预先分配空间;
(2)在内存中,数组是一块连续的区域;
(3)数组中每个元素都有对应的下标。
1.2 数组的优点
数组的随机访问速度快。在对数组中元素进行查找时,我们很容易通过元素下标快速查找到对应元素,时间复杂度为O(1)。
1.3 数组的缺点
(1)存在浪费内存空间的可能。由于数组在使用前要预先分配空间,在无法预知可能需要的数组空间大小的情况下,预分配较大的数组长度会导致内存空间的浪费。
(2)插入和删除效率低下。数组是在内存中是一块连续的区域,每个变量对应一个位置,在对数组进行中间或起始位置插入时,需要将插入点及其后面的数据在内存中后移;同理,在进行删除操作时,也需要将删除点以后的全部数据前移。
(3)无法扩展。数组是提前定义的,在空间分配完成后不能根据数据进行空间扩展,数组空间不够用时需要重新定义新的足够长的数组。
二、链表
链表是由一系列结点组成的数据链。链表的每一个结点由本结点的数据和指向下一个结点的指针组成。链表根据指针的不同可分为单向链表、双向链表、循环链表。
- 单向(线性)链表。单向链表中的结点由数据和一个指向下一结点的指针组成,每个结点只包含一个指针域。
- 双向链表。双向链表每个结点初数据域外有两个指针域,分别指向上一个结点和下一个结点。
- 循环链表。循环链表在线性链表的基础上,表中最周一个结点的指针域指向头结点,整个链表形成一个环。
不同类型的链表在进行数据操作时有所不同。
2.1 链表的特点
(1)链表数据元素的存储单元可以是连续的也可以是不连续的,任何两个元素之间的存储位置没有固定的联系;
(2)链表中的每个数据元素都由数据域和指针域组成;
(3)不需要预分配空间,可自由扩展;
2.2 链表的优点
(1)任意位置插入和删除效率高。在任意位置插入和删除操作时,只需要改变前后元素的指针即可,不需要移动元素位置,时间复杂度为O(1)。
(2)内存利用率高。链表不需要提前分配内存空间,利用指针使其存储空间可以是非连续的,不会浪费内存。
(3)可自由扩展。链表的存储空间大小不固定,可根据需要随时进行插入和删除操作。
2.3 链表的缺点
(1)查找数据效率低。链表中数据元素不像数组中元素有下标,因此,在对链表中数据元素进行查找时,每一次都必须从头结点开始查找。
(2)单个元素占用空间大。每个元素结点都由指针域和数据域组成,相比数组元素来说占用空间更大。