LinkedList<Integer> list = new LinkedList<>();
list.add(0,1);
list.add(1,2);
list.add(1,3);
list.add(0,4);
list.add(2,5);
2->3->5-1->4
public void add(int index, E element) {
//检查index是否合法,即 index>=0 && index <=size
checkPositionIndex(index);
//如果index为链表大小,说明只需要尾节点直接插入即可
if (index == size)
linkLast(element);
else
//在index之前插入元素
linkBefore(element, node(index));
}
linkLast方法,正常插入方法
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
//链表不为空,将新节点连接到尾节点后面
l.next = newNode;
size++;
modCount++;
}
linkBefore方法
/**
* Inserts element e before non-null Node succ.
*/
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
//succ的前驱节点为pred eg:1->2 2的前驱节点为1
final Node<E> pred = succ.prev;
//生成一个新的节点newNode 通过 succ,succ的前驱节点,以及元素e
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
// 如果前驱节点为null,那么将新节点直接弄在第一个节点上
/*
eg: 1->2->3
list.add(0,4)
succ=1
pred = null
将4直接插在第一个节点上 新链表为 4->1->2->3
*/
if (pred == null)
first = newNode;
else
//如果前驱节点不null
/*
eg: 4->1->2->3
list.add(2,5)
succ=2
pred = 1
将5pred即节点值为1的后面 新链表为 4->1->5->2->3
*/
pred.next = newNode;
size++;
modCount++;
}
node(index)方法
返回指定索引的节点
首先后判断索引是否小于总数的一半,如果小于则会正向遍历,否则会反向遍历
比如现在链表为 1 -> 2 -> 3 -> 4
node(1):2
node(2):3
/**
* Returns the (non-null) Node at the specified element index.
*/
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
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;
}
}
总结
LinkedList list = new LinkedList<>();
list.add(0,1); list: 1
list.add(1,2); list: 1->2
list.add(1,3); list: 1-3->2
list.add(0,4); list: 4->1->3->2
list.add(2,5); list: 4->1->5->3->2