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

Какое время поиска элемента в LinkedList?

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

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

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

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

Ответ: Время поиска элемента в LinkedList

Время поиска элемента в LinkedList составляет O(n) (линейное время). Это один из главных недостатков LinkedList — поиск требует перебора элементов с начала списка.

Основная причина: Нет прямого доступа к индексу

ArrayList (O(1) доступ): Массив в памяти хранит элементы подряд, поэтому доступ по индексу мгновенный. Для получения элемента на индексе 2 просто вычисляется адрес памяти: baseAddress + 2 * elementSize.

LinkedList (O(n) поиск): Связный список состоит из узлов, разбросанных в памяти. Каждый узел ссылается на следующий. Для получения элемента на индексе 2 нужно:

  1. Начать с головы (первый узел)
  2. Перейти к следующему узлу
  3. Перейти к следующему узлу ещё раз Итого: 2 перехода для индекса 2.

Сложность для разных операций

ОперацияArrayListLinkedListПочему
get(index)O(1)O(n)ArrayList прямой доступ, LinkedList нужен обход
add(element)O(1)*O(1)*ArrayList O(n) при переполнении буфера
add(index, element)O(n)O(n)**LinkedList O(1) если уже найден узел
remove(index)O(n)O(n)**LinkedList O(1) если уже найден узел
contains(obj)O(n)O(n)Нужен поиск в обоих

Практический пример

LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < 100_000; i++) {
    list.add(i);
}

// Получить элемент на индексе 50_000
int elem = list.get(50_000);  // 50_000 итераций!

LinkedList оптимизирует поиск, выбирая более короткий путь (с начала или с конца), но это не меняет асимптотическую сложность O(n).

Когда LinkedList быстрее

Операции добавления/удаления в НАЧАЛЕ:

LinkedList<String> list = new LinkedList<>();
list.addFirst("element");    // O(1) - просто изменить указатель
list.removeFirst();          // O(1)

// vs ArrayList - требует сдвига всех элементов O(n)
ArrayList<String> arr = new ArrayList<>();
arr.add(0, "element");       // O(n)

Правильная итерация через Iterator:

// Хорошо: O(n)
for (Integer num : list) {
    System.out.println(num);
}

// Плохо: O(n2) - каждый get требует O(n)
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

Сравнение времени

На практике доступ к элементу в LinkedList может быть в 100-1000 раз медленнее, чем в ArrayList, в зависимости от позиции элемента. Для элемента посередине списка из 100_000 элементов нужно выполнить 50_000 переходов по ссылкам.

Практические рекомендации

Используй ArrayList если:

  • Много операций доступа по индексу
  • Нужна случайная выборка
  • Нет частых добавлений/удалений в начало

Используй LinkedList если:

  • Много добавлений/удалений в начало или конец
  • Работаешь через Iterator
  • Реализуешь Queue или Deque

Избегай LinkedList если:

  • Нужны частые операции get(index)
  • Используешь цикл с индексом вместо Iterator

Итоговый вывод

Время поиска элемента в LinkedList составляет O(n) потому что нет прямого доступа по индексу. Нужно пройти через все узлы до нужного элемента. В худшем случае это требует n операций. В современной Java ArrayList практически всегда лучше по умолчанию, если нет специфических причин использовать LinkedList. Даже операции добавления в начало редко оправдывают использование LinkedList из-за его медленного доступа по индексу.

Какое время поиска элемента в LinkedList? | PrepBro