【转】[数据结构] 数组与链表的优缺点和区别

【原文】http://www.2cto.com/kf/201605...html

概述

  数组 是将元素在内存中连续存放,因为每一个元素占用内存相同,能够经过下标迅速访问数组中任何元素。可是若是要在数组中增长一个元素,须要移动大量元素,在内存中空出一个元素的空间,而后将要增长的元素放在其中。一样的道理,若是想删除一个元素,一样须要移动大量元素去填掉被移动的元素。若是应用须要快速访问数据,不多插入和删除元素,就应该用数组。程序员

  链表 中的元素在内存中不是顺序存储的,而是经过存在元素中的指针联系到一块儿,每一个结点包括两个部分:一个是存储 数据元素 的 数据域,另外一个是存储下一个结点地址的 指针。
  若是要访问链表中一个元素,须要从第一个元素开始,一直找到须要的元素位置。可是增长和删除一个元素对于链表数据结构就很是简单了,只要修改元素中的指针就能够了。若是应用须要常常插入和删除元素你就须要用链表。数组

内存存储区别

数组从栈中分配空间, 对于程序员方便快速,但自由度小。数据结构

链表从堆中分配空间, 自由度大但申请管理比较麻烦. 指针

逻辑结构区别

数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的状况。当数据增长时,可能超出原先定义的元素个数;当数据减小时,形成内存浪费。 htm

链表动态地进行存储分配,能够适应数据动态地增减的状况,且能够方便地插入、删除数据项。(数组中插入、删除数据项时,须要移动其它数据项) 排序

总结

一、存取方式上,数组能够顺序存取或者随机存取,而链表只能顺序存取; 队列

二、存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不必定; 内存

三、存储空间上,链表因为带有指针域,存储密度不如数组大; get

四、按序号查找时,数组能够随机访问,时间复杂度为O(1),而链表不支持随机访问,平均须要O(n); 

五、按值查找时,若数组无序,数组和链表时间复杂度均为O(n),可是当数组有序时,能够采用折半查找将时间复杂度降为O(logn); 

六、插入和删除时,数组平均须要移动n/2个元素,而链表只需修改指针便可; 

七、空间分配方面:
  数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间能够扩充,但须要移动大量元素,致使操做效率下降,并且若是内存中没有更大块连续存储空间将致使分配失败;
  链表存储的节点空间只在须要的时候申请分配,只要内存中有空间就能够分配,操做比较灵活高效;

8.经典数据结构涵盖了多种抽象数据类型(ADT),其中包括栈、队列、有序列表、排序表、哈希表及分散表、树、优先队列、集合和图等。对于每种状况,均可以选用数组或某一种链表数据结构来实现其抽象数据类型(ADT)。因为数组和链表几乎是创建全部ADT的基础,因此称数组与链表为基本数据结构

相关文章
相关标签/搜索