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


class Node:
    def __init__(self, val):
        self.val = val      # Значение узла
        self.prev = None    # Ссылка на предыдущий узел
        self.next = None    # Ссылка на следующий узел

class DoublyLinkedList:
    def __init__(self):
        self.head = None    # Начало списка
        self.tail = None    # Конец списка
        self.size = 0       # Длина списка

    def __setitem__(self, index, value):
        # Проверяем, что индекс в допустимых пределах
        if index < 0 or index >= self.size:
            raise IndexError("Index out of range")
        
        # Оптимизация: если индекс ближе к концу, идём с конца
        if index > self.size // 2:
            # Идём от хвоста назад
            curr = self.tail                # Начинаем с последнего узла
            for _ in range(self.size - 1 - index): # Количество шагов назад
                curr = curr.prev            # Двигаемся к предыдущему узлу
        else:
            # Идём от головы вперёд
            curr = self.head                # Начинаем с первого узла
            for _ in range(index):          # Количество шагов вперёд
                curr = curr.next            # Двигаемся к следующему узлу
        
        # Когда узел найден, меняем его значение
        curr.val = value                    # Присваиваем новое значение