Рубрики
Без рубрики

Список вдвойне связан в Python

В этом руководстве вы узнаете о вдвойне связанном списке. Вы узнаете, как реализовать вдвойне связанный список в Python. https://youtu.be/vlmzmnunlki Список вдвойне связанного списка, в отличие от единообразных списков состоит из значения данных вместе с следующим и предыдущим указателем. Давайте увидим простой пример вдвойне связанного списка. … вдвойне связанный список в Python Подробнее »

Автор оригинала: Neeraj Sujan.

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

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

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

Операции в вдвойне связанном списке

Сообщите нам о рассмотрении некоторых общих операций, которые мы можем выполнить в списке вдвойне связанного списка

  1. Вставка
  2. Удаление
  3. Обход

Давайте сначала преподаваем, определяя класс узла, который содержит следующий и предыдущий указатель. Всякий раз, когда новый узел создан, два указателя устанавливаются на 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 сценария, которые могут возникнуть при вставке узла в списке.

  1. Вставка в передней части списка
  2. Вставка в задней части списка
  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()