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 # Присваиваем новое значение