1. 数组,
所有元素都连续的存储于一段内存中,且每个元素占用的内存大小相同。这使得数组具备了通过下标快速访问数据的能力。
但连续存储的缺点也很明显,增加容量,增删元素的成本很高,时间复杂度均为 O(n)。
增加数组容量需要先申请一块新的内存,然后复制原有的元素。如果需要的话,可能还要删除原先的内存。
删除元素时需要移动被删除元素之后的所有元素以保证所有元素是连续的。
增加元素时需要移动指定位置及之后的所有元素,然后将新增元素插入到指定位置,如果容量不足的话还需要先进行扩容操作。
总结一下数组的优缺点:
- 优点:可以根据偏移实现快速的随机读写。
- 缺点:扩容,增删元素极慢。
2.链表,
由若干个结点组成,每个结点包含数据域和指针域。
一般来讲,链表中只会有一个结点的指针域为空,该结点为尾结点,其他结点的指针域都会存储一个结点的内存地址。
链表中也只会有一个结点的内存地址没有存储在其他结点的指针域,该结点称为头结点。
链表的存储方式使得它可以高效的在指定位置插入与删除,时间复杂度均为 O(1)。
在结点 p 之后增加一个结点 q 总共分三步:
a.申请一段内存用以存储 q (可以使用内存池避免频繁申请和销毁内存)。
b.将 p 的指针域数据复制到 q 的指针域。
c.更新 p 的指针域为 q 的地址。
删除结点 p 之后的结点 q 总共分两步:
a.将 q 的指针域复制到 p 的指针域。
b.释放 q 结点的内存。