首先,在我们搞清楚二者的区别之前,我们就要明白:什么是数组?什么是链表?
数组
简单来说,数组(Array)是有序的元素序列。
// 数组
arrary1 = [1,2,3,4,5,6];
arrary2 = ['a','b','c','d','e','f','g'];
arrary3 = ['点','个','赞','支','持','一','下'];
我们都知道,数组是非常方便去读取的。我们只需要做如下的操作即可:
// 读取第i个元素
printf(array[i]);
这个性质是由其本身在计算机内存上的存储方式而决定的。数组的存储方式是连续的。所以能够快速的通过它的内存地址去读取到数组内部的元素。如下图所示:
数组在计算机内存上的存储方式
那么,我们要想在这个数组上再去插入新的元素该怎么办呢?首先,我们需要知道:数组的存储方式是连续的。那么在任意插入新元素时,也要确保数组存储的连续性。所以,在数组中插入新元素,会改变插入新元素的位置和之后的所有元素的位置。其后的元素的位置都需要往后移
由上图可见,如果我们想在数组中再插入新的元素。必须要确保满足以下任一情况:
1.若是在首部插入,在插入位置之前有可用的内存空间去存储新元素。
2.如果内部插入元素,必须确保之后由可用的内存空间,用来保存由于新元素插入而改变的数组元素。
可见,上图中恰好有可用的内存空间才能插入新元素。那么,之后的内存空间被占用了,没有足够的内存去存储的话该怎么办?那就可以使用链表来存储了。
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
简单来说:链表是由两部分内容组成:数据域和指针域。数据域内存储需要保存的数据,指针域内存储用来指向链表下一个元素的内存地址值。在计算机内存中的存储方式如下图所示:
链表在计算机内存上的存储方式
从链表的存储方式我们不难看出,在链表中插入新的元素是十分方便的。在任意位置插入新元素只需要改变上一个元素指针域的内存地址就可以了。
由上图可见,再链表进行插入操作时只需要做一个操作:
改变上一个元素的指针域的内存地址即可
说完链表的插入,我们再来看看链表的读取是否方便。如果我们需要读取链表中第 i 个元素。那么首先我们需要做的操作从 i-1 的指针域获取 i 内存地址才能读取到元素,i-1 的地址就要通过读取 i-2 ...以此类推,我们必须从第一个元素开始读取,读 i 次才能获取到所需要的元素。
总结
读取 | 插入 | |
数组 | O(1) | O(n) |
链表 | O(n) | O(1) |
在数据读取的方面,数组更有优势。在数据插入方面,链表是更有优势的。
虽然数组与链表各有优劣,但是在大多数情况下,数组用的比链表要多一点。因为它支持随机访问。而且能快速的访问到你想要的元素。
创作不易,希望能够支持一下!
什么是支持呢?
(ノ∇︎〃 )
点个赞,收藏一下,点个关注之类的。
如果你有更好的想法或者发现文章的不足之处,望大家不吝赐教!