数组和链表是我们在开发过程中最常见的数据结构(树:“有被冒犯到!”),面试种惊颤有提到的数组查询快,增删慢;链表查询慢,增删快
那么,为什么哪?我们今天就来一个追根探底。
首先,我们需要明确一点,数组查询快,链表查询慢,这句话表达是不准确的。正确的描述应该是数组支持随机查询,根据首地址+下标的查询,时间复杂度位O(1),查询效率快,链表不支持随机查询,必须从第一个开始遍历,时间复杂度为0(N),查询效率慢
在内存中,数组是一整块连续的区域,链表是随机分散在内存中。我们需要知道的是计算机会给每一个内存单元分配一个地址,当我们需要随机查询某个数据时,计算机会根据寻址公式:目标地址=首地址+i*元素大小。
因为数组是连续的,因此我们可以根基首地址+下标得到目标地址,而链表只能根据链表的记录,从首地址进行遍历查询。
其次数组增删慢,链表增删快,这句话表述的也不准确。
链表中的元素会保存两个属性,一个是值,一个是下一个元素的指针,当需要插入或者删除时,只需要更改相信元素的指针就可以了。
数组的增删比较复杂,插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移,删除数据时,待删除位置后面的所有元素都需要向前搬移。在尾部插入或者删除元素时,数组的增删和链表的增删速度都是O(1),另外数组还涉及到扩容。
数组的缺点:需要提前设置好内存大小,如果设置的大小不合适,可能会浪费内存空间。
数组应用场景:
1、数据量可控,大小稳定,变动小;
2、经常做的运算是按序号访问数据元素;
链表应用场景:
1、数据大小位置;
2、频繁做插入删除操作;
链表家族:
单链表:单链表的元素有两个属性,一个是值,一个是指向下一个元素
双向链表:双向链表的元素有三个属性,一个是值,一个是指向下一个元素,一个是指向上一个元素
循环链表:循环链表值得是链表的尾节点指向的下一个元素的地址是链表的首节点