Какая реализация LinkedList используется в Java: односвязная или двусвязная?

«Какая реализация LinkedList используется в Java: односвязная или двусвязная?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java java.util.LinkedList реализован как двусвязный список. Каждый узел содержит ссылки на предыдущий и следующий элементы, что обеспечивает эффективную навигацию в обоих направлениях.

Внутренняя структура узла:

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;
    }
}

Преимущества двусвязной реализации:

  • Добавление и удаление элементов с обоих концов за O(1)
  • Эффективная поддержка ListIterator с перемещением назад и вперед
  • Упрощение операций удаления произвольного узла (не требуется поиск предыдущего элемента)
Сравнение производительности: Операция LinkedList (двусвязный) Односвязный список
addFirst() / removeFirst() O(1) O(1)
addLast() / removeLast() O(1) O(n) (требуется обход)
Удаление произвольного элемента O(1) при наличии итератора O(n)
Потребление памяти Выше (две ссылки на узел) Ниже (одна ссылка)