链表

空间利用率链表>数组
链表分类

  • 单链表

  • 双向链表
    LinkedHashMap

  • 循环链表

  • 双向循环链表

双向链表多了一个指针存储前驱指针,空间换时间思想

应用:LinkedHashMap??

数组与链表的比较

时间复杂度

  • 插入:数组O(n) 链表O(1)
  • 随机访问:数组O(1) 链表O(n)

数组连续存储空间

  • 可借助CPU缓存机制,预读数组中的数据效率更高
  • 大数组对碎片化内存利用不足,易导致内存不足;

链表

  • 额外指针存储浪费空间,不适合内存要求苛刻的场景;
  • 链表频繁删除和插入,导致频繁的内存申请和释放,易造成内存碎片,如果是JAVA可能导致频繁GC

循环链表

如何判断满/空?

  • 方式1
    rear 尾进,front头出
    空队列 rear==front
    满队列 (rear+1)% size = front
    缺点:少用一个空间
  • 方式2、3

思考题

字符串是通过单链表来存储的,那该如何来判断是一个回文串呢?

  1. 快慢指针确定中间节点
    判断快指针next和next.next不为空,
    偶数时得到的节点是前半部分最后一个节点d1
    奇数时得到的节点是中间节点d1
    获取得到节点d1的next都是后半部分节点头结点
  2. 翻转后半部分
  3. 比较前后两部分是否相同。
  4. 还原