65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
class Node:
|
|
def __init__(self, value):
|
|
self.value = value
|
|
self.next = None
|
|
self.prev = None
|
|
|
|
|
|
class DoublyCircularList:
|
|
def __init__(self):
|
|
self.head = None
|
|
|
|
def append(self, value):
|
|
new_node = Node(value)
|
|
if not self.head:
|
|
self.head = new_node
|
|
new_node.next = new_node
|
|
new_node.prev = new_node
|
|
else:
|
|
tail = self.head.prev
|
|
tail.next = new_node
|
|
new_node.prev = tail
|
|
new_node.next = self.head
|
|
self.head.prev = new_node
|
|
|
|
def __iter__(self):
|
|
return ReverseIterator(self.head)
|
|
|
|
|
|
class ReverseIterator:
|
|
def __init__(self, head):
|
|
self.current = head.prev if head else None
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def __next__(self):
|
|
if not self.current:
|
|
raise StopIteration
|
|
val = self.current.value
|
|
self.current = self.current.prev
|
|
return val
|
|
|
|
|
|
while True:
|
|
print("1 - Создать список и начать итерацию")
|
|
print("0 - Выход")
|
|
choice = input("Выбор: ")
|
|
|
|
if choice == "0":
|
|
break
|
|
|
|
if choice == "1":
|
|
try:
|
|
data = input("Введите элементы через пробел: ").split()
|
|
lst = DoublyCircularList()
|
|
for x in data:
|
|
lst.append(x)
|
|
|
|
it = iter(lst)
|
|
n = int(input("Сколько элементов вывести: "))
|
|
for _ in range(n):
|
|
print(next(it))
|
|
except:
|
|
print("Ошибка")
|