Открыть сервис

Двусвязный список

Двусвязный список — это структура данных, представляющая собой последовательность связанных элементов (узлов), каждый из которых содержит хранимые данные и две ссылки: на предыдущий и на следующий элемент в последовательности. В отличие от односвязного списка, где узел указывает только на следующий элемент, двусвязный список обеспечивает возможность двунаправленного обхода — как от начала к концу, так и от конца к началу. Это ключевое отличие определяет его основные преимущества и недостатки по сравнению с другими линейными структурами данных, такими как массивы и односвязные списки.

История

Концепция связных списков восходит к ранним работам в области информатики. Первое формальное описание связных списков приписывается Аллену Ньюэллу, Клиффу Шоу и Герберту Саймону, которые в 1955–1956 годах разработали язык обработки списков IPL (Information Processing Language). В IPL использовались односвязные списки. Двусвязные списки, как более гибкая модификация, появились вскоре после этого, когда возникла потребность в эффективных операциях удаления и вставки элементов в середине списка, а также в обратном обходе. Они стали фундаментальной частью многих языков программирования и операционных систем, например, для управления памятью и очередями. В 1960-х годах двусвязные списки были реализованы в таких языках, как Lisp и Simula, а позже стали стандартной частью библиотек шаблонов C++ (std::list) и Java (java.util.LinkedList).

Устройство и принцип работы

Основным элементом двусвязного списка является узел (node). Каждый узел содержит три поля:

  1. Данные (Data) — полезная информация, которая может быть любого типа (число, строка, объект).
  2. Указатель на следующий узел (Next) — ссылка на следующий элемент в последовательности. Для последнего узла списка этот указатель обычно равен null (или None в Python, nil в Lisp).
  3. Указатель на предыдущий узел (Prev) — ссылка на предыдущий элемент. Для первого узла списка этот указатель равен null.

Сам список обычно хранит ссылки на первый узел (голову, head) и на последний узел (хвост, tail). Это позволяет выполнять операции на обоих концах списка за константное время O(1).

Основные операции

Классификация и разновидности

Хотя двусвязный список сам по себе является конкретной структурой, существуют его модификации:

Применение

Двусвязные списки находят применение в различных областях программирования и компьютерных наук:

Сравнение с другими структурами данных

ХарактеристикаДвусвязный списокОдносвязный списокМассив
Доступ по индексуO(n)O(n)O(1)
Вставка/удаление в началеO(1)O(1)O(n) (сдвиг элементов)
Вставка/удаление в концеO(1) (с tail)O(n) (без tail)O(1) (амортизированно)
Вставка/удаление в серединеO(1) (если известен узел)O(1) (если известен узел)O(n) (сдвиг элементов)
Память на элементВысокая (2 указателя)Средняя (1 указатель)Низкая (только данные)
Обратный обходДаНетДа (по индексу)

Преимущества и недостатки

Преимущества:

Недостатки:

Реализация в языках программирования

Многие современные языки программирования предоставляют встроенные реализации двусвязных списков:

Интересные факты

Источники

  1. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. — 3-е изд. — М.: Вильямс, 2013. — 1328 с.
  2. Седжвик Р. Фундаментальные алгоритмы на C++. Часть 1-4. Анализ. Структуры данных. Сортировка. Поиск. — М.: ДиаСофт, 2002. — 688 с.
  3. Кнут Д. Э. Искусство программирования. Том 1. Основные алгоритмы. — 3-е изд. — М.: Вильямс, 2006. — 720 с.
  4. Документация по стандартной библиотеке C++: std::list. cppreference.com.
  5. Документация Java Platform SE 8: java.util.LinkedList. Oracle.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →