Реализация add(index, element)
выглядит следующим образом:
public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
Если вы добавляете элемент в хвост LinkedList
, метод linkLast
может выполняться в постоянное время;LinkedList
всегда имеет прямой доступ к своему последнему элементу, и обход не требуется.
В противном случае, метод node
обходится дорого, так как требуется обход не более половины списка:
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
, как вы можете видеть ниже в linkBefore
:
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}