def pop(self, index=-1):
# ① проверка на пустоту
if not self.head:
raise IndexError("pop from empty list")
# ② нормализация индекса (отрицательный → положительный)
if index < 0:
index += self.size
# ③ проверка выхода за границы
if not 0 <= index < self.size:
raise IndexError("pop index out of range")
# ④ идём от ближнего конца до нужного узла
if index < self.size // 2:
node = self.head # старт от начала
for _ in range(index):
node = node.next # шаг вперёд
else:
node = self.tail # старт от конца
for _ in range(self.size - 1 - index):
node = node.prev # шаг назад
# ⑤ переподключение соседей
if node.prev: # есть левый сосед?
node.prev.next = node.next # левый → через нас → правый
else:
self.head = node.next # мы были головой → новая голова
if node.next: # есть правый сосед?
node.next.prev = node.prev # правый → через нас → левый
else:
self.tail = node.prev # мы были хвостом → новый хвост
# ⑥ уменьшаем размер и возвращаем данные
self.size -= 1
return node.data