为什么 Java 的 LinkedList 的双链表实现不会链接后面元素
问题描述
JDK7中 LinkedList private 方法 private void linkFirst(E e)在新添加元素时链表不会断裂?
代码来源于 JDK7
private void linkFirst(E e) {final Node<E> f = first;final Node<E> newNode = new Node<>(null, e, f);first = newNode;if (f == null) last = newNode;else f.prev = newNode; // 此处没有执行 newNode.next = f; newNode.next 不会链接后面的元素size++;modCount++; }
问题解答
回答1:private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev; }}
final Node<E> newNode = new Node<>(null, e, f); // 构造函数的第3个参数不就是 next 元素了。回答2:
为什么会断链呢?f指向原来的first,将新的newNode设置为first。这个时候就判断,如果原来的链表就是空的,那么last也就是first咯。如果不为空,那么就是将f<原来的首节点>的prev就指向first。
我猜你之所以觉得会断链是因为,你没看到first的next指向f。额next这个在Node中已经传进去了final Node<E> newNode = new Node<>(null, e, f);private static class Node<E> {
E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev; }}
相关文章:
1. atom编译器 如何格式化前端代码文件?2. javascript - webpack热加载配置不生效3. css3 - 我的css用less写的,eclipse的jsp文件要修改css很麻烦,怎么解决?4. android - 新建项目卡在Gradle:Resolvedependencies’:app:_debugCompile’5. angular.js - ng-repeat的数据排序,我用了orderBy: d.supportNum为什么失效?6. python - Pycharm调试代码进行列表遍历时,如何直接赋值指定元素7. javascript - 关于在angularjs的select中遇到的问题!!8. android - NavigationView 的侧滑菜单中如何保存新增项(通过程序添加)9. android - 使用listview加载不同item,数据填充错误。10. python - 基于scrapy-redis的分布式爬虫运行的时候不能正常运行 遇到的问题如下截图所示