描述
数组和链表的区别,这个问题,不仅面试中经常遇到,考研的同学也得掌握才行。
这两个的区别,还得从他们在内存里面的布局讲起。
数组是一块连续的内存,这块内存可以在栈空间也可以在堆空间:
一般都会有个容量限制,比如:
int arr[5];
就表示数组有 5 个元素,在内存中占 20 个字节。
而且为了方便使用,数组在存储数据的时候尽量保持连续。
链表在内存中不用连续,位置由系统随机分配,所以这就需要某种机制能把各个数据串联起来。
链表由一个一个结点组成,每个结点都分成数据域和指针域,指针域指向下一个结点。
这种结构也决定了链表没有容量限制,只要内存够用,就能保存更多的数据。
数组和链表的访问方式也不一样。
数组因其在内存中连续排布,访问的时候只要数组名加上数组下标就能精确定位到指定的元素。
数组名本身表示数组首元素的地址,加上下标,其实就是个偏移量,所以就访问速度而言,数组的效率确实要高。
链表因为在内存中排布不连续,所以不支持这种随机访问。要锁定某个结点,必须得借助指针,一步一步向下移动,结点越多,访问的效率越低。
他俩的最大区别,还得是插入和删除,尤其是针对开头的插入和删除操作。
假设都往第一个位置插入元素。
如果是数组,在空间还没有满的情况下,先要把后面的元素逐个向后移动,然后把第一个位置腾出来,再把新元素放进去。 所以数组里面的元素越多,插入的效率也就越低。
链表的插入方法完全不一样,先来一个新结点,填上数据域和指针域,然后修改头节点的指向关系,不管链表中有多少个结点,插入的步骤都是这么多。
所以在插入和删除操作上,大部分情况下链表的效率要高于数组。
数组和链表在软件开发中出现的场景很高,数组简单,链表更实用。
审核编辑:刘清
打开APP阅读更多精彩内容