Автор оригинала: Neeraj Sujan.
В этом руководстве вы узнаете о вдвойне связанном списке. Вы узнаете, как реализовать вдвойне связанный список в Python.
Список вдвойне связан, в отличие от одиночных связей списков состоит из значения данных вместе с следующим и предыдущим указателем. Давайте увидим простой пример вдвойне связанного списка.
В приведенном выше показателе вы можете визуализировать изобразительное представление вдвойне связанного списка. Каждый узел имеет указатель на следующий узел и указатель на предыдущий узел, представленный следующим и предыдущим указателем соответственно.
Операции в вдвойне связанном списке
Сообщите нам о рассмотрении некоторых общих операций, которые мы можем выполнить в списке вдвойне связанного списка
- Вставка
- Удаление
- Обход
Давайте сначала преподаваем, определяя класс узла, который содержит следующий и предыдущий указатель. Всякий раз, когда новый узел создан, два указателя устанавливаются на NULL изначально.
class Node(object):
def __init__(self, value):
self.data = value
self.prev = None
self.next = None
Мы начали при инициализации конструктора класса узлов и инициализации и объявления значения данных, следующего указателя и предыдущего указателя.
Вы можете создать узел следующим образом
node = Node(12)
Это создаст узел со значением 12.
Давайте теперь начнем с определения вдвойне связанного списка и внедрение общих операций, которые мы можем выполнять на нем
Мы начинаем с объявления класса под названием DoublyLinkeDList и инициализация указателя головы ни на что
class DoublyLinkedList(object):
def __init__(self):
self.head = NoneВставляя элемент в вдвойне связанный список
Теперь мы посмотрю на то, как мы можем вставить новый узел в вдвойне связанный список
Существует 3 сценария, которые могут возникнуть при вставке узла в списке.
- Вставка в передней части списка
- Вставка в задней части списка
- Вставка в случайном положении в списке
Вставка узла в передней части списка
Начнем с определения функции под названием insert_front который принимает узел в качестве входного параметра. Затем мы проверяем, будет ли список пустым или нет. Если список пустое, мы назначаем указатель головки на вновь созданный узел. Если список не пустое, то есть. Указатель головки нет, мы не назначаем следующий указатель вновь созданного узла в головку списка и предыдущего указателя головы на узел. Затем мы переназнаем указатель головы, чтобы указать на вновь созданный узел.
def insert_front(self, node):
if self.head is not None:
node.next = self.head
self.head.prev = node
self.head = node
else:
self.head = node
Вставка узла в задней части списка
Теперь мы посмотрим, как вставить узел в конце списка или хвоста списка.
def insert_back(self, node):
if self.head is not None:
current_node = self.head
while(current_node.next is not None):
current_node = current_node.next
current_node.next = node
node.prev = current_node
else:
self.head = nodeМы определяем функцию под названием insert_back который принимает узел в качестве входного параметра. Мы снова проверяем, если список пусты или нет. Если список не пусто, мы указываем на голову на новый узел. Если список не пустой I.E. Есть уже несколько узлов, присутствующих в списке, мы пройдем список, пока не достигнем хвоста списка. Как только мы находимся на хвосте списка, мы назначаем следующий указатель последнего узла, чтобы указать на новый узел и предыдущий указатель узла, чтобы указать на предыдущий хвост списка. В конце этой операции новый узел становится хвостом списка.
Вставка в случайном положении в списке
Теперь мы посмотрим, как вставить новый узел в списке в случайном положении. Сначала мы проверяем, будет ли список пустым или нет. Если список пуст, мы вставляем узел в передней части списка, вызывая insert_front Функция мы реализовали. Если список не пусто, то мы инициализируем переменную счетчика и инициализируйте текущий узел, чтобы указать на голову списка. Затем мы проходим через список и продолжаем обновлять счетчик и текущий узел. Как только мы достигаем положения индекса, где мы хотели бы вставить узел, мы указываем на следующий указатель текущего узла, предыдущего указателя узла в текущий узел, а также следующий указатель текущего узла для недавно созданный узел.
Мы также проверяем, является ли следующий новый узел последним элементом или узлом. Если это не последний элемент в списке, мы указываем на предыдущий указатель следующего узла на новый узел.
def insert(self, node, index):
if self.head is not None:
current_counter = 1
current_node = self.head
while current_node is not None:
if current_counter == (index-1):
node.next = current_node.next
node.prev = current_node
current_node.next = node
if node.next is not None:
node.next.prev = node
current_node = current_node.next
current_counter += 1
else:
print('List is empty')
self.insert_front(node)Удаление элемента в DLL
Теперь мы посмотрим на другую важную операцию, которую мы можем выполнять в списке вдвойне связанного списка. Мы начинаем с определения функции под названием Удалить. Функция возьмет значение узла, которое мы хотели бы удалить из списка. Затем мы проверяем, будет ли список пустым или нет. Если список пусто, то мы возвращаемся из функции. Если список не пусто, мы проверим, хотите ли узел мы хотете удалить, является узлом головки или нет. Если это узел головки, мы удаляем узел и назначьте указатель головки None. Если узел, который мы хотели бы удалить, не является ни узел головки, мы сначала пройдете через список, чтобы найти узел, как только мы найдем узел в списке, мы сначала объявляем узел в качестве временного узла. Следующий указатель предыдущего элемента в списке будет указывать на следующий указатель временного узла, а предыдущий указатель следующего узла в списке будет указывать на предыдущий узел. Затем мы назначаем временное узел None и удалить узел.
def delete(self, value):
if self.head is None:
print('Doubly Linked List is empty')
return
if self.head.next == None:
if self.head.data == value:
temp_node = self.head
self.head = None
del temp_node
return
else:
print("Element is not found in our list")
return
else:
temp_node = self.head.next
while temp_node is not None:
if temp_node.data == value:
temp_node.prev.next = temp_node.next
temp_node.next.prev = temp_node.prev
temp_node = None
return
temp_node = temp_node.next
if temp_node.data == value:
temp_node.prev.next = None
del temp_node
return
print("Element is not found in the list")Резюме
В этом блоге вы узнали, как реализовать вдвойне связанный список в Python. Мы также смотрели, как выполнить некоторые общие операции в списке, как вставка и удаление.
Вы можете найти весь код ниже
class Node(object):
def __init__(self, value):
self.data = value
self.prev = None
self.next = None
class DoublyLinkedList(object):
def __init__(self):
self.head = None
def insert_front(self, node):
if self.head is not None:
node.next = self.head
self.head.prev = node
self.head = node
else:
self.head = node
def insert_back(self, node):
if self.head is not None:
current_node = self.head
while(current_node.next is not None):
current_node = current_node.next
current_node.next = node
node.prev = current_node
else:
self.head = node
def insert(self, node, index):
if self.head is not None:
current_counter = 1
current_node = self.head
while current_node is not None:
if current_counter == (index-1):
node.next = current_node.next
node.prev = current_node
current_node.next = node
if node.next is not None:
node.next.prev = node
current_node = current_node.next
current_counter += 1
else:
print('List is empty')
self.insert_front(node)
def delete(self, value):
if self.head is None:
print('Doubly Linked List is empty')
return
if self.head.next == None:
if self.head.data == value:
temp_node = self.head
self.head = None
del temp_node
return
else:
print("Element is not found in our list")
return
else:
temp_node = self.head.next
while temp_node is not None:
if temp_node.data == value:
temp_node.prev.next = temp_node.next
temp_node.next.prev = temp_node.prev
temp_node = None
return
temp_node = temp_node.next
if temp_node.data == value:
temp_node.prev.next = None
del temp_node
return
print("Element is not found in the list")
def display(self,):
current_node = self.head
while current_node is not None:
if current_node.next is None:
print(current_node.data, end=' ', flush=True)
else:
print(current_node.data, end='-->', flush=True)
previous_node = current_node
current_node = current_node.next
print('\n')
print('List in reverse order')
while previous_node is not None:
if previous_node.prev is None:
print(previous_node.data, end=' ', flush=True)
else:
print(previous_node.data, end='-->', flush=True)
previous_node = previous_node.prev
print('\n')
if __name__ == "__main__":
node1 = Node(12)
node2 = Node(13)
dll = DoublyLinkedList()
dll.insert_front(node1)
dll.insert_front(node2)
dll.display()
dll.insert_back(Node(14))
dll.insert_back(Node(26))
dll.insert_front(Node(1))
dll.display()
dll.insert(Node(2), 2)
dll.insert(Node(5), 3)
dll.display()
print('Deleting node')
dll.delete(5)
dll.display()