Как реализовать двусвязный список на питоне? Руководство с примерами и кодом

Для реализации двусвязного списка на Python вы можете создать класс, который будет представлять узел списка.

Каждый узел будет содержать ссылку на предыдущий и следующий узлы, а также значение.


class Node:
    def __init__(self, value):
        self.value = value
        self.prev = None
        self.next = None

Затем, вы можете создать класс для двусвязного списка, который будет содержать методы для добавления, удаления и отображения элементов.


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

    def add_node(self, value):
        new_node = Node(value)
        if self.head is None:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
            new_node.prev = current

    def remove_node(self, value):
        current = self.head
        while current:
            if current.value == value:
                if current.prev:
                    current.prev.next = current.next
                else:
                    self.head = current.next
                if current.next:
                    current.next.prev = current.prev
                break
            current = current.next

    def display(self):
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next

Вы можете использовать эти методы, чтобы добавлять и удалять элементы из двусвязного списка:


# Создание объекта двусвязного списка
dllist = DoublyLinkedList()

# Добавление элементов в список
dllist.add_node(1)
dllist.add_node(2)
dllist.add_node(3)

# Отображение элементов списка
dllist.display()

# Удаление элемента из списка
dllist.remove_node(2)

# Отображение элементов после удаления
dllist.display()

Детальный ответ

Как реализовать двусвязный список на питоне

В программировании существует множество структур данных, и одной из них является двусвязный список. Двусвязный список особенно полезен, когда нам нужно манипулировать элементами списка в обеих направлениях. В этой статье мы рассмотрим, как реализовать двусвязный список на питоне.

Введение в двусвязный список

Двусвязный список состоит из узлов, каждый из которых содержит данные и две ссылки - на предыдущий и следующий узлы. Сам список хранит ссылку на первый и последний узлы.

Давайте начнем с создания класса для узла двусвязного списка:


class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

Класс Node имеет три атрибута: data (данные узла), prev (ссылка на предыдущий узел) и next (ссылка на следующий узел). Значения по умолчанию для prev и next - None.

Создание двусвязного списка

Чтобы создать двусвязный список, нам нужно сначала создать объекты Node, а затем связать их вместе. У нас также будет хранить ссылки на первый и последний узлы списка.


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
        else:
            new_node.prev = self.tail
            self.tail.next = new_node
            self.tail = new_node

Класс DoublyLinkedList имеет два атрибута: head (ссылка на первый узел списка) и tail (ссылка на последний узел списка). Метод append позволяет добавить новый узел в конец списка. Если список пуст, новый узел становится и head, и tail. В противном случае, новый узел становится следующим узлом для текущего tail и tail обновляется на новый узел.

Вставка элементов в двусвязный список

Для вставки элемента на определенную позицию в двусвязном списке, мы должны изменить ссылки prev и next двух соседних узлов. Давайте рассмотрим метод insert:


def insert(self, data, position):
    new_node = Node(data)
    
    if position == 0:
        new_node.next = self.head
        self.head.prev = new_node
        self.head = new_node
    else:
        current = self.head
        count = 0
        
        while current.next and count < position - 1:
            current = current.next
            count += 1
        
        if current.next:
            new_node.prev = current
            new_node.next = current.next
            current.next.prev = new_node
            current.next = new_node
        else:
            self.append(data)

Метод insert принимает два аргумента: data (данные для нового узла) и position (позиция, на которую нужно вставить элемент). Если позиция равна 0, новый узел становится head списка. В противном случае, мы перебираем список до нужной позиции и изменяем ссылки для вставки нового узла.

Удаление элементов из двусвязного списка

Для удаления узла из двусвязного списка нужно также изменять ссылки prev и next соседних узлов. Рассмотрим метод remove:


def remove(self, data):
    current = self.head
    
    while current:
        if current.data == data:
            if current.prev:
                current.prev.next = current.next
            else:
                self.head = current.next
            
            if current.next:
                current.next.prev = current.prev
            else:
                self.tail = current.prev
            
            return
        
        current = current.next

Метод remove принимает аргумент data (данные узла, который нужно удалить). Мы перебираем список, пока не найдем узел с указанными данными. Затем мы изменяем ссылки для предыдущего и следующего узлов, чтобы "обойти" удаляемый узел.

Пример использования двусвязного списка

Давайте посмотрим на пример использования нашего двусвязного списка:


# Создаем объект двусвязного списка
dll = DoublyLinkedList()

# Добавляем элементы в список
dll.append(10)
dll.append(20)
dll.append(30)

# Вставляем элемент на позицию 1
dll.insert(15, 1)

# Удаляем элемент со значением 20
dll.remove(20)

В этом примере мы создаем объект DoublyLinkedList, добавляем несколько элементов в список, вставляем элемент на позицию 1 и удаляем элемент со значением 20.

Заключение

Теперь вы знаете, как реализовать двусвязный список на питоне. Двусвязный список - это мощная структура данных, которая позволяет легко манипулировать элементами списка в обоих направлениях. Используйте код и примеры из этой статьи в своих проектах, чтобы создавать эффективные и гибкие программы.

Видео по теме

Структуры данных в Python #2 Двусвязные списки

#11. Делаем двусвязный список на С++ | Структуры данных

Двусвязный список | Динамические структуры данных #2

Похожие статьи:

Как удалить библиотеку Python: шаг за шагом руководство

Что такое 'n' в Python?

Как создать словарь в Python: подробное руководство для начинающих

Как реализовать двусвязный список на питоне? Руководство с примерами и кодом

🔍 Что такое shape в Python? Узнайте значение и использование shape в програмировании на питоне

🔧 Как добавить Python в PATH Windows 10: пошаговая инструкция

Как выбрать Python в Visual Studio Code: полезные советы для разработчиков