//初始化一个空的列表
public LinkedList() {
}
//添加一个特定的元素到列表的末尾
public boolean add(E e) {
linkLast(e);
return true;
}
//定义末尾结点last
transient Node<E> last;
//链接e作为最后一个元素
void linkLast(E e) {
//原末尾结点作为该结点的前一个结点,注意这里使用的是对象引用,拿到了内存地址,相当于指针
final Node<E> l = last;
//该结点的下一个结点置为空
//构造一个新结点
final Node<E> newNode = new Node<>(l, e, null);
//对象引用,当前结点成为末尾结点
last = newNode;
//假如是一个空链表,则将新结点作为首结点
if (l == null)
first = newNode;
else
//将原末尾结点指向新结尾结点
//这里可以看出Java中的链表使用的是双向链表
l.next = newNode;
//链表的Size+1
size++;
//检测到并发性的标识
modCount++;
}
//结点类
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;
}
}
//删除此列表中指定位置的元素。
//转移任何左边的后续元素(从索引中减去一个)。
//返回从列表中删除的元素。
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
//在数组访问之前使用,检查索引是否越界
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
//返回指定元素索引处的(非null)节点。
Node<E> node(int index) {
// assert isElementIndex(index);
//这里可以看出,在根据索引获取指定元素时,将整个链表从中间分成前后两个部分
//这是前一部分
if (index < (size >> 1)) {
//从首元素开始,向后遍历,一直next
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
//后部分从末尾遍历
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
// 删除链表中的一个结点
E unlink(Node<E> x) {
// assert x != null;
// 获取将要删除结点的值
final E element = x.item;
// 获取将要删除结点的下一个结点
final Node<E> next = x.next;
// 获取将要删除结点的前一个结点
final Node<E> prev = x.prev;
// 若删除首结点,则将下一个结点作为首结点
if (prev == null) {
first = next;
} else {
//非首结点
//前一个结点的指向后一个结点(前后之间隔了一个结点)
prev.next = next;
//当前元素的prev指针置空
x.prev = null;
}
// 若删除尾结点,则将前一个结点作为尾结点
if (next == null) {
last = prev;
} else {
//后一个结点指向前一个结点
next.prev = prev;
//当前结点指向null
x.next = null;
}
//当前结点值置为null,便于GC回收
x.item = null;
//Size-1
size--;
//检测到并发性的标识
modCount++;
return element;
}
LinkedList源码分析
最新推荐文章于 2024-07-05 17:30:16 发布