您的位置:首页 > 其它

链表系列一:比较链表与数组

2013-06-17 14:34 190 查看
数组和链表是两种不同的数据存储方式,数组的存储需要一段连续的内存空间,而链表的存储则不需要连续存放,它是通过指针链接各个结点构成一个表结构。链表又分为单链表、双链表、单项循环链表和双向循环链表,单链表中每一个结点只需要保存当前结点的数据和一个指向下一个元素的指针,而双链表还需要保存一个指向上一个元素和指针,循环链表则还需要尾结点中保存一个指向第一个结点的指针。具体的讲,数组和链表的区别主要体现在以下几个方面:

1)逻辑结构

数组在内存中是连续顺序存储的,使用前必须指定数组大小以便为其分配内存空间,大小固定不能动态改变。对数组插入需要分配新的连续内存空间然后移动所有的数据元素,删除同样需要移动删除元素之后的所有元素并造成多余的空间被浪费。由于插入和删除需要大量移动元素,因而效率低,复杂度为O(n);另一方面,由于顺序存储,对数组的随机访问就很方便,可以通过首地址和下标直接定位,复杂度为O(1)。

链表在内存中的存储是随机的,各个结点通过指针链接,增减不需要移动元素,复杂度为O(1)。增加元素的时候只需要使用new/malloc分配一个结点所需的内存空间,删除时可以使用delete/free释放掉不再使用的内存空间,因而可以适应数据的动态增减。但是链表的随机访问效率很低,因为需要从头开始遍历直到找到那个元素,复杂度可以达到O(n)。

此外,由于数组和链表的逻辑结构的不同,也造成了两者在另一个问题上的差别:越界问题。正是由于数组的顺序存储,越界就成了数组使用过程中经常出现的问题,而链表则没有这个问题。

2)内存结构

(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小;链表中从堆中分配空间,自由度大,但是申请管理比较麻烦。

总结:数组占用空间小,存储效率高,存储速度快,便于查询,但插入和删除效率低;链表由于保存指针占用较大的空间,且随机访问效率低,但是插入删除效率高,适合需要频繁插入删除的应用中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: