数组,
-
所有元素都连续的存储于一段内存中,且每个元素占用的内存大小相同。这使得数组具备了通过下标快速访问数据的能力。
-
但连续存储的缺点也很明显,增加容量,增删元素的成本很高,时间复杂度均为 O(n)。
-
增加数组容量需要先申请一块新的内存,然后复制原有的元素。如果需要的话,可能还要删除原先的内存。
-
删除元素时需要移动被删除元素之后的所有元素以保证所有元素是连续的。增加元素时需要移动指定位置及之后的所有元素,然后将新增元素插入到指定位置,如果容量不足的话还需要先进行扩容操作。
总结一下数组的优缺点:
优点:可以根据偏移实现快速的随机读写。
缺点:扩容,增删元素极慢。
链表,
-
由若干个结点组成,每个结点包含数据域和指针域。
-
链表的存储方式使得它可以高效的在指定位置插入与删除,时间复杂度均为 O(1)。
-
在结点 p 之后增加一个结点 q 总共分三步:
-
申请一段内存用以存储 q (可以使用内存池避免频繁申请和销毁内存)。
-
将 p 的指针域数据复制到 q 的指针域。
-
更新 p 的指针域为 q 的地址。
-
删除结点 p 之后的结点 q 总共分两步:
-
将 q 的指针域复制到 p 的指针域。
-
释放 q 结点的内存。
面试问题总结
无法高效获取长度,无法根据偏移快速访问元素,是链表的两个劣势。然而面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决。
Tips:双指针并不是固定的公式,而是一种思维方式~
作者:Time-Limit
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。