链表定义
链表也是一种线性的的数据结构,它和数组的不同点是它不需要连续的内存块来存储,它使用指针可以将零散的内存使用起来。
常见的三种链表
单向链表
双向链表
循环链表
链表分析
链表随机访问
因为链表使用内存不连续所以无法像数组一样通过首地址和下标计算出对应地址,只能遍历整个链表去找,因此时间复杂度为O(n)
链表插入
因为不需要连续的内存所以不牵扯数据的搬迁。
- 在已知某个元素的前提下,在他的位置后面插入新数据只进行指针修改操作就可以了所以时间复杂度为O(1);
- 当元素未知时需要先查找数据然后在插入,此时时间复杂度为O(n)
链表删除
- 删除已知元素的后一个元素时,只需要修改指针就行了,时间复杂度为O(1)。
- 删除已知元素的前一个元素时,单向链表需要找到前一个元素的地址,时间复杂度为O(n);双向链表存储了前驱指针所以时间复杂度为O(1)
- 删除未知元素的前、后元素时需要先找到元素然后在进行删除操作,时间复杂度为O(n)
链表缺点
- 内存空间消耗更大,因为需要额外的空间存储指针信息。
- 对链表进行频繁的插入和删除操作,会导致频繁的内存申请和释放,容易造成内存碎片,如果是Java语言,还可能会造成频繁的GC(自动垃圾回收器)操作。