Сколько стоит получение элемента по индексу в LinkedList?
- Чем ArrayList отличается от LinkedList?
- Когда LinkedList быстрее ArrayList?
- Почему LinkedList почти не используют?
O(n): произвольного доступа нет, до позиции нужно дойти по ссылкам (JDK начинает с ближнего конца).
- Цикл
for (i...) list.get(i)по LinkedList — квадратичная сложность - Дешёвы только операции у концов и удаление через итератор
А ещё На практике ArrayList почти всегда быстрее: память подряд и кэш процессора
Подробно
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 почти всегда лучше.
Частые ошибки
- Обходить связный список циклом по индексам.
- Выбирать его ради «быстрой вставки», не учитывая стоимость поиска позиции.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓O(n): идём по узлам от начала или конца
- ✗Константа, как и в ArrayList: узлы проиндексированы
- ✗Логарифм от размера списка
- ✗Зависит от объёма свободной памяти
Что спросят дальше
- В каких случаях связный список действительно выигрывает?
- Почему массив обычно быстрее при обходе?
Разбор темы
- LinkedList и миф о дешёвой вставке
Двусвязные узлы, реальная стоимость операций, cache locality и почему ArrayList/ArrayDeque почти всегда лучше.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.