Kodomo

Пользователь

Отображение текста в формате 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: