来,一起阅读源码,通过LinkedList回顾基础( 三 )
1.复制一个指向尾节点的引用l(蓝色部分)
文章插图
2.将待添加元素构造为一个节点newNode , prev指向尾节点(蓝色部分)
文章插图
3.last指向新构造的节点(红色部分)
文章插图
5.将添加前最后元素的next指向新节点(绿色部分)
文章插图
此时 , 引用newNode和l引用依然存在 , 但是已经没有意义 。
add(int index, E element)
将元素添加到指定位置
public void add(int index, E element) {checkPositionIndex(index);if (index == size)linkLast(element);elselinkBefore(element, node(index));}
可以看出 , 该方法首先检查指定索引是否符合规则 , 也就是在index >= 0 且 index <= size;
如果index==size , 则相当于直接在链表尾部插入 , 直接调用linkLast方法;
以上不满足 , 调用linkBefore方法 , 而linkBefore中调用了node(index) 。
node(index)
node(index)作用是返回指定索引的节点 , 这里用到了我们前面说到的一个知识 , 先判断索引在前半部分还是在后半部分 , 再决定从头还是从尾开始遍历 。
Node
linkBefore
回过头来看linkBefore , 参数分别为待插入的元素 , 以及指定位置的节点
void linkBefore(E e, Node
上述过程可以看出 , 关键过程在于linkBefore方法 , 我们同样画图表示:
头结点处添加:
1.复制指向目标位置的上一个节点引用
Node
文章插图
本质是指向null
2.构造新节点 , prev指向目标位置的上一个节点 , next指向原来目标位置节点
Node
文章插图
3.目标节点的prev指向待添加新节点
succ.prev = newNode;
文章插图
4.first指向新节点
first = newNode;
文章插图
中间位置添加
如图 , 假设指定添加到第三个节点 , 即index=2 , 则第二个和第三个节点之间必须有断开的过程 。
文章插图
【来,一起阅读源码,通过LinkedList回顾基础】1.复制指向目标位置的上一个节点引用 , 也就是第二个节点
Node
文章插图
2.构造新节点 , prev指向复制的上一个节点 , next指向原来目标位置上的节点
Node
文章插图
3.目标节点的prev指向待添加新节点
succ.prev = newNode;
文章插图
5.目标位置上一节点的next指向新节点
pred.next = newNode;
文章插图
get(int index)
public E get(int index) {checkElementIndex(index);return node(index).item;}
get方法是按索引获取元素 , 本质调用node(index) , 上一部分已经提到了这个方法 , 虽然双向链表在一定程度上提高了效率 , 由N减少到N/2 , 但本质上时间复杂度还是N的常数倍 , 所以轻易不要用这个方法 , 在需要随机访问的时候应当使用ArrayList , 在需要遍历访问以及增删多查找少的时候考虑LinkedList 。 之所以要有这个方法是由List接口指定 , 这个方法也是LinkedList没有实现RandomAccess接口的原因之一 。
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 计费|5G是如何计费的?
- V2X|V2X:确保未来道路交通数据交换的安全性
- 助力|上班族的小妙招:怎么弄pdf签名?编辑器来助力
- iPhone|折叠屏iPhone要来?曝苹果开始测试|OPPO Reno5真机曝光
- T.I.T:“科创引领 数启未来”的弄潮儿
- 苹果|iPhone13迎来变化!或回归指纹解锁,这几点备受用户喜爱
- 易来|RA95显色只是起步,2020双12选灯必逛好店!