Отображение текста в формате reStructured невозможно без установки Docutils.
Разбор задания
==============
Итак, у нас есть двусвязный список вида::
None <- 3 <- 2 <- 1 <- end <- right
left -> 3 -> 2 -> 1 -> end
Нам нужно с правого конца удалить элемент, содержащий 1, и эту самую 1
вернуть пользователю. Для этого нужно сделать четыре действия:
запомнить 1, перекинуть с end указатель налево на 2, перекинуть с 2
указатель направо на end, вернуть запомненную 1. (Собственно, эту
последовательность действий я произносил и рисовал на доске).
Итого::
def pop(self):
result = self.last()
self.right.prev = self.right.prev.prev # сейчас 2-ка -- это right.prev.prev
self.right.prev.next = self.right # у нас изменился right, и теперь 2-ка это right.prev
return result
Теперь вспоминаем дополнительные вопросы. Как поведёт себя этот код,
если в списке остался только один элемент? Это значит, что
self.right.prev.prev == None. Следовательно, в следующей строке мы уже
не можем сказать self.right.prev.next, потому, что self.right.prev --
это уже None. Более того, в этом случае у нас после операции pop
останется пустой список, поэтому нам нужно, чтобы у нас left и right
оба указывали на заглушку. Поправимся::
def pop(self):
result = self.last()
self.right.prev = self.right.prev.prev
if self.right.prev:
self.right.prev.next = self.right
else:
self.left = self.right
return result
Следующий вопрос: как будет себя вести функция, если в списке пусто?
Ответ: ещё self.last() выбросит исключение. И в это месте в нашей
постановке задачи не сказано, как мы себя хотим вести. Оставить так,
что функция выбрасывает исключение -- это весьма осмысленное
поведение; например, встроенный питонский list.pop так себя ведёт.
Если мы очень хотим, чтобы исключение в этом случае не выбрасывалось,
мы можем добавить ещё одну проверку.
Я же предпочту в этом случае ничего не дописывать, и так всё и оставить.
.. vim: set ts=4 sts=4 et sw=4: