目录
- 一、知识点回顾
- 二、LinkedList 的 add() 和 remove() 的实现
- 2.1 list.add(e) 实现原理
- 2.2 list.remove(e) 实现原理
一、知识点回顾
双向链表特点:
- 区间离散,占用内存宽松,空间复杂度小,时间复杂度 O(n)。
- 优点:插入删除速度快,内存利用率高,没有大小固定,扩展灵活。
- 缺点:不能随机查找,每次都是从第一个或最后一个开始(查询效率低)。
二、LinkedList 的 add() 和 remove() 的实现
2.1 list.add(e) 实现原理
- 第 1 步,将元素 e 封装为新的
Node{}
节点,并且将last
指针指向的末尾节点作为新节点的prev
,然后将last
指针指向新节点。 - 第 2 步,判断原有链表是否为空:
- 原有链表为空,则调整
first
指针指向新节点; - 原有链表不为空,则将末尾节点的
next
指针指向新节点。
- 原有链表为空,则调整
2.2 list.remove(e) 实现原理
- 第 1 步,判断索引是否有效:
- 如果索引无效,抛出异常:
IndexOutOfBoundsException
。
- 如果索引无效,抛出异常:
- 第 2 步,根据索引是否位于上半段,找出节点位置:
- 如果索引位于上半段,则自顶向下遍历;
- 如果索引位于下半段,则自底向上遍历。
- 第 3 步,根据待移除节点是否为第一个节点进行调整:
- 如果待移除节点是第一个节点, 则调整
first
指针; - 如果待移除节点不是第一个节点,则断开待移除节点与前节点的链接。
- 如果待移除节点是第一个节点, 则调整
- 第 4 步,根据待移除节点是否为最后一个节点进行调整:
- 如果待移除节点是最后一个节点,则调整
last
指针; - 如果待移除节点不是最后一个节点,则断开待移除节点与后节点的链接。
- 如果待移除节点是最后一个节点,则调整
(点击图片放大)
整理完毕,完结撒花~ 🌻