Получить доступ

Сколько стоит получение элемента по индексу в LinkedList?

JuniorКоллекции
Ещё спрашивают так:
  • Чем ArrayList отличается от LinkedList?
  • Когда LinkedList быстрее ArrayList?
  • Почему LinkedList почти не используют?
Коротко

O(n): произвольного доступа нет, до позиции нужно дойти по ссылкам (JDK начинает с ближнего конца).

  • Цикл for (i...) list.get(i) по LinkedList — квадратичная сложность
  • Дешёвы только операции у концов и удаление через итератор

А ещё На практике ArrayList почти всегда быстрее: память подряд и кэш процессора

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

LinkedList — двусвязный список: каждый элемент хранится в отдельном узле со ссылками на предыдущий и следующий. Адрес пятидесятого элемента вычислить нельзя — нужно пройти по цепочке. Реализация в JDK идёт с того конца, который ближе к индексу, но сложность всё равно O(n).

Отсюда практическая ловушка: обход LinkedList по индексам в цикле for (int i = 0; i < list.size(); i++) list.get(i) превращает линейный проход в квадратичный. Перебирать нужно через for-each или итератор.

Миф «вставка в LinkedList дешёвая» верен только частично: сама вставка узла — O(1), но сначала до места вставки нужно дойти за O(n). Дешевы только добавление и удаление у концов и удаление через итератор во время обхода.

На реальном железе ArrayList обычно выигрывает и там, где по теории должен проигрывать: элементы лежат в памяти подряд и хорошо попадают в кэш процессора, а у узлов LinkedList ещё и большой расход памяти на ссылки. Для очереди и стека лучше ArrayDeque.

Что хотят услышать

  • get(i) у LinkedList — O(n), с объяснением почему.
  • Ловушка с обходом по индексам.
  • Понимание, где LinkedList на самом деле дешёв.
  • Практический вывод: ArrayList или ArrayDeque почти всегда лучше.

Частые ошибки

  • Обходить связный список циклом по индексам.
  • Выбирать его ради «быстрой вставки», не учитывая стоимость поиска позиции.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Линейно от индекса: нужно пройти по цепочке узлов от начала или от конца
  • ✗Константа, как и в ArrayList
  • ✗Логарифм от размера списка
  • ✗Зависит от объёма свободной памяти

Что спросят дальше

  • В каких случаях связный список действительно выигрывает?
  • Почему массив обычно быстрее при обходе?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем