问题描述:
1,LinkedList 进行初始化的时候
/**
* Constructs an empty list.
*/
public LinkedList() {
}
2,add 方法
/**
* Appends the specified element to the end of this list.
*
* <p>This method is equivalent to {@link #addLast}.
*
* @param e element to be appended to this list
* @return {@code true} (as specified by {@link Collection#add})
*/
public boolean add(E e) {
linkLast(e);
return true;
}
3,往linkLast(e);方法下追,当前就是添加的核心方法
/**
* Links e as last element.
*/
void linkLast(E e) {
/*
* 第一次添加的时候,last 是当前定义的一个Node<E>对象变量
* //transient Node<E> last;
*/
final Node<E> l = last;
/*
* 在我们创建一个新的Node对象的时候,Node构造方法中
* 第一个值:prev 指向上一个对象
* 第二个值:item 当前添加的元素
* 第三个值:next 指向下一个对象
*/
final Node<E> newNode = new Node<>(l, e, null);
// 创建完成后 赋值给当前 last
last = newNode;
// 判断l是否等于null,可见l就是last赋值的,在第一次添加的时候
// last就是null 所以l的变量就是null
if (l == null) // 满足条件
first = newNode;// 赋值给first
else
l.next = newNode;
size++;// 索引加加
modCount++; // 修改次数加加
}
4,第一次添加结果出来就是这样的
5,当进行第二次添加的时候
/**
* Links e as last element.
*/
void linkLast(E e) {
/*
* 第二次添加的时候,last 就是之前上一个Node对象
*/
final Node<E> l = last;
/*
* 在我们创建一个新的Node对象的时候,Node构造方法中
* 第一个值:prev 指向上一个对象,所以说,我们创建第二个对象时
* 当前这个prev就会指向上一个
* 第二个值:item 当前添加的元素
* 第三个值:next 指向下一个对象
*/
final Node<E> newNode = new Node<>(l, e, null);
// 创建完成后 赋值给当前 last 最后一个
last = newNode;
// 判断l是否等于null,此时l等于上一个Node对象
// l不等于null
if (l == null) // 不满足条件
first = newNode;
else
// 让上一个Node的next指向当前新创建的节点
l.next = newNode;
size++;// 索引加加
modCount++; // 修改次数加加
}
6,第二次添加出来的示意图
7,由此内推,每次添加一个新的节点的时候,节点都是往后追加的,新的节点的prev会指向上一个节点,而上一个节点则会指向一个当前这个新的节点
8,Node节点则是当前一个静态内部类
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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112581.html