Advertisement
Orrin19

Linked List

Oct 5th, 2023
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.09 KB | None | 0 0
  1. """Модуль связного списка"""
  2.  
  3.  
  4. class LinkedListItem:
  5.     """Узел связного списка"""
  6.  
  7.     def __init__(self, data=None):
  8.         self.content = data
  9.         self.next_item = None
  10.         self.previous_item = None
  11.  
  12.     @property
  13.     def next_item(self):
  14.         """Следующий элемент"""
  15.         return self._next
  16.  
  17.     @next_item.setter
  18.     def next_item(self, value):
  19.         self._next = value
  20.         if value is not None and value.previous_item != self:
  21.             value.previous_item = self
  22.  
  23.     @property
  24.     def previous_item(self):
  25.         """Предыдущий элемент"""
  26.         return self._previous
  27.  
  28.     @previous_item.setter
  29.     def previous_item(self, value):
  30.         self._previous = value
  31.         if value is not None and value.next_item != self:
  32.             value.next_item = self
  33.  
  34.     def __repr__(self):
  35.         return str(self.content)
  36.  
  37.  
  38. class LinkedList:
  39.     """Связный список"""
  40.  
  41.     def __init__(self, *args):
  42.         self.first_item = None
  43.         if len(args) > 0:
  44.             self.append(*args)
  45.  
  46.     @property
  47.     def last(self):
  48.         """Последний элемент"""
  49.         if self.first_item is None:
  50.             return None
  51.         return self.first_item.previous_item.content
  52.  
  53.     def append_left(self, item):
  54.         """Добавление слева"""
  55.         list_item = LinkedListItem(item)
  56.         if self.first_item is None:
  57.             self.first_item = list_item
  58.             list_item.next_item = list_item
  59.         else:
  60.             self.first_item.previous_item = list_item
  61.             self.first_item = list_item
  62.         return self
  63.  
  64.     def append_right(self, item):
  65.         """Добавление справа"""
  66.         list_item = LinkedListItem(item)
  67.         if self.first_item is None:
  68.             self.first_item = list_item
  69.             list_item.next_item = list_item
  70.         else:
  71.             self.first_item.previous_item.next_item = list_item
  72.             self.first_item.previous_item = list_item
  73.         return self
  74.  
  75.     def append(self, *args):
  76.         """Добавление справа"""
  77.         for item in args:
  78.             self.append_right(item)
  79.         return self
  80.  
  81.     def remove(self, item):
  82.         """Удаление первого вхождения"""
  83.         if self.first_item is None:
  84.             raise ValueError("List is empty")
  85.  
  86.         flag = True
  87.         for current_item in self:
  88.             if current_item.content == item:
  89.                 flag = False
  90.                 if current_item.next_item == current_item:
  91.                     self.first_item = None
  92.                 else:
  93.                     if current_item == self.first_item:
  94.                         self.first_item = current_item.next_item
  95.                     current_item.previous_item.next_item = current_item.next_item
  96.                     current_item.next_item.previous_item = current_item.previous_item
  97.                     break
  98.         if flag:
  99.             raise ValueError("Item not found")
  100.         return self
  101.  
  102.     def insert(self, previous, item):
  103.         """Вставка справа от первого вхождения"""
  104.         if self.first_item is None:
  105.             self.append(item)
  106.         else:
  107.             for current_item in self:
  108.                 if current_item.content == previous:
  109.                     list_item = LinkedListItem(item)
  110.                     list_item.next_item = current_item.next_item
  111.                     list_item.previous_item = current_item
  112.                     current_item.next_item = list_item
  113.                     break
  114.         return self
  115.  
  116.     def __len__(self):
  117.         count = 0
  118.         current_item = self.first_item
  119.         while current_item is not None:
  120.             count += 1
  121.             current_item = current_item.next_item
  122.             if current_item == self.first_item:
  123.                 break
  124.         return count
  125.  
  126.     def __iter__(self):
  127.         current_item = self.first_item
  128.         while current_item is not None and self.first_item is not None:
  129.             yield current_item
  130.             current_item = current_item.next_item
  131.             if current_item == self.first_item:
  132.                 break
  133.  
  134.     def __getitem__(self, index: int):
  135.         if index < 0:
  136.             index = len(self) + index
  137.         if index < 0 or index >= len(self):
  138.             raise IndexError("Index out of range")
  139.  
  140.         current_index = 0
  141.         current_item = self.first_item
  142.         while current_index != index:
  143.             current_item = current_item.next_item
  144.             current_index += 1
  145.             if current_item == self.first_item:
  146.                 break
  147.  
  148.         return current_item.content
  149.  
  150.     def __contains__(self, item):
  151.         for current_item in self:
  152.             if current_item.content == item:
  153.                 return True
  154.         return False
  155.  
  156.     def __repr__(self):
  157.         return str(self)
  158.  
  159.     def __str__(self):
  160.         string_list = []
  161.         for item in self:
  162.             string_list.append(str(item))
  163.         return '[' + ', '.join(string_list) + ']'
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement