PassFront
  1. PassFront
  2. База знаний
  3. Массивы и списки

Чем односвязный список отличается от двусвязного?

Массивы и списки

В односвязном списке узел хранит только указатель на следующий элемент, а в двусвязном — ещё и на предыдущий: двусвязный позволяет движение в обе стороны и удаление узла за O(1), но стоит больше памяти и кода.

Односвязный

  • Обход только вперёд; удаление узла требует указателя на предыдущий, иначе поиск за O(n).
  • Минимум памяти: один указатель на узел. Используется в стеках, цепочках хеш-таблиц, lock-free структурах.

Двусвязный

  • Удаление и вставка по указателю на сам узел за O(1) — критично для LRU-кеша и очередей.
  • Два указателя на узел и вдвое больше переприсваиваний при каждой операции — выше шанс ошибиться.

Полезные приёмы

  • Фиктивные guard-узлы (head и tail) убирают особые случаи пустого списка.
  • Разворот односвязного списка за O(n) — классическая задача на три указателя.
  • Середина за один проход: быстрый и медленный указатели.

Коротко для собеседования

Двусвязный список нужен, когда узел надо удалять или переставлять за O(1) по ссылке на него самого, — классический пример LRU-кеш. Платишь лишним указателем на узел и большим числом переприсваиваний, поэтому там, где хватает прохода вперёд, берут односвязный.

Другие вопросы раздела