## LinkedList源码分析(四)
/**
* 添加一个符合当前LinkedList泛型约束数据类型一致的元素带结婚中
*
* @param e 符合LinkedList 要求的元素
* @return 添加成功返回true
*/
public boolean add(E e) {
// 最后一个节点位置,当前元素保证成Node节点之后的存储位置
Node<E> l = last;
// 创建得到一个新的Node节点
Node<E> newNode = (Node<E>) new Node<>(l, e, null);
// 因为当前元素需要保存到LinkedList结尾 last一定要被赋值newNode
last = newNode;
// 第一个有效节点时,first同时指向当前节点
if (null == first) {
first = newNode;
} else {
// 原本最后一个节点next指向新的newNode
l.next = newNode;
}
// 有效元素 += 1
size += 1;
return true;
}
/**
* 同是尾插法操作
*
* @param e 符合泛型约束的具体数据类型
* @return 返回插入状态
*/
public boolean addLast(E e) {
return add(e);
}
/**
* 在LinkedList链表头添加一个元素
*
* @param e 符合泛型约束的具体数据类型
* @return 返回插入状态
*/
public boolean addFirst(E e) {
/*
*三个地址:
* 1. LinkedList链表头 first ==> newNode
* 2. newNode --> next --> old FirstNode
* 3. old FirstNode.prew --> newNode
*/
// 原始的first节点
Node<E> f = first;
// 创建新的newNode
Node<E> newNode = new Node<>(null, e, f);
// LinkedList链表头内的first一定执行newNode
first = newNode;
if (null == first) {
last = newNode;
} else {
// 原始的first节点,prev赋值为newNode
f.prev = newNode;
}
size += 1;
return true;
}
/**
* 在指定下标位置插入指定元素
*
* @param index 指定下标位置
* @param e 要插入的元素
* @return 插入成功返回true
*/
public boolean add(int index, E e) {
checkIndex(index);
if (index == size) {
addLast(e);
return true;
} else if (index == 0) {
addFirst(e);
} else {
unlinkAdd(e, node(index));
}
return true;
}
/**
* 向除头尾插入元素的实际方法
*
* @param e 插入的元素
* @param node 更新链的元素
*/
private void unlinkAdd(E e, Node<E> node) {
Node<E> prev = node.prev;
Node<E> newNode = new Node<>(prev, e, node);
prev.next = newNode;
}