Что такое двунаправленный (двусвязный) список

Ответ

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

Структура узла: ... ↔ [ prev | data | next ] ↔ ...

Это позволяет обходить список в обоих направлениях: от начала к концу и от конца к началу.

Преимущества перед односвязным списком

  • Двусторонний обход: Возможность двигаться в обе стороны.
  • Эффективное удаление: Если есть указатель на узел, его можно удалить за O(1), так как не нужно искать предыдущий элемент для перенаправления ссылок.
  • Простая вставка: Вставка до или после заданного узла выполняется за O(1).

Недостатки

  • Дополнительная память: Каждый узел хранит дополнительный указатель prev, что увеличивает расход памяти.
  • Более сложная реализация: Операции вставки и удаления требуют обновления большего количества ссылок, что повышает вероятность ошибки.

Пример реализации на Python

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None # Ссылка на следующий узел
        self.prev = None # Ссылка на предыдущий узел

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    # Добавление элемента в конец списка
    def append(self, data):
        new_node = Node(data)
        if self.head is None:
            # Если список пуст, новый узел становится и головой, и хвостом
            self.head = new_node
            self.tail = new_node
            return

        # Связываем новый узел с текущим хвостом
        self.tail.next = new_node
        new_node.prev = self.tail
        # Перемещаем указатель хвоста на новый узел
        self.tail = new_node