def pop(self, idx=-1):
"""Удалить по индексу (по умолчанию последний) и вернуть значение.
Время: с конца/начала — O(1), из середины — O(n). Память O(1) — только указатели."""
if self.size == 0:
raise IndexError("pop from empty list")
node = self._get_node(idx)
prev_node, next_node = node.prev, node.next
if prev_node:
prev_node.next = next_node
else: # удалили голову
self.head = next_node
if next_node:
next_node.prev = prev_node
else: # удалили хвост
self.tail = prev_node
self.size -= 1
return node.val