Загрузка данных


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