← Назад к вопросам

Есть ли в LinkedList ссылка на следующий объект?

1.0 Junior🔥 141 комментариев
#Коллекции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

LinkedList: Ссылки на следующий объект

Да, LinkedList использует ссылки на следующий элемент, а точнее — двусвязный список (doubly-linked list). Каждый узел содержит ссылки как на следующий, так и на предыдущий элемент.

Структура узла LinkedList

Внутри LinkedList каждый элемент представлен внутренним приватным классом Node:

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

Как это работает

LinkedList<String> list = new LinkedList<>();
list.add("A");  // Node(null, "A", null)
list.add("B");  // Node(nodeA, "B", null)
list.add("C");  // Node(nodeB, "C", null)

Визуально структура выглядит так:

null <- [A] <-> [B] <-> [C] -> null
       prev/next двусвязный список

Каждый узел знает своего соседа справа (next) и слева (prev), что позволяет:

  • Итерировать в обе стороны эффективно
  • Удалять элементы за O(1), если уже знаете узел
  • Быстро вставлять элементы в начало и конец

Преимущества двусвязного списка

1. Двусторонняя итерация

ListIterator<String> iter = list.listIterator(list.size());
while (iter.hasPrevious()) {
    System.out.println(iter.previous());
}

2. Быстрый доступ к концу списка

list.add(element);      // O(1) — добавляет в конец
list.addFirst(element); // O(1) — добавляет в начало
list.removeLast();       // O(1) — удаляет с конца

3. Эффективное удаление по итератору

for (Iterator<String> it = list.iterator(); it.hasNext();) {
    if (it.next().equals("B")) {
        it.remove(); // O(1) — быстро удаляет текущий узел
    }
}

Сравнение с ArrayList

ОперацияArrayListLinkedList
Доступ по индексуO(1)O(n)
Вставка в конецO(1) amortizedO(1)
Вставка в началоO(n)O(1)
Удаление из концаO(1)O(1)
Вставка в серединуO(n)O(n) для поиска + O(1) для вставки

Когда использовать LinkedList

✓ Частые операции в начале/конце списка ✓ Двусторонняя итерацияЧастые удаления по итератору ✓ Когда нужна очередь или дек

// LinkedList как Deque (двусторонняя очередь)
Deque<String> deque = new LinkedList<>();
deque.addFirst("X");   // добавить в начало
deque.addLast("Y");    // добавить в конец
deque.removeFirst();   // удалить с начала
deque.removeLast();    // удалить с конца

Не использовать для частого доступа по индексу ✗ Не использовать вместо ArrayList для больших коллекций (больше памяти на ссылки)

Особенности реализации в Java

LinkedList в Java:

  • Имеет ссылку first на первый узел и last на последний
  • Позволяет эффективно навигировать с обоих концов
  • Основан на двусвязной структуре (Node с prev и next)
  • Поддерживает RandomAccess через индексы, но это неэффективно

Заключение

Да, LinkedList содержит ссылки на следующие (и предыдущие) объекты через поля next и prev в каждом узле. Это реализация классического двусвязного списка, который обеспечивает O(1) операции в начале и конце, но требует O(n) для доступа по индексу и больше памяти из-за дополнительных ссылок.