Вернуть строковое представление класса узла в обратном порядке, используя рекурсию - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть узел класса:

class LinkedNode:
    __slots__ = 'val', 'next'
    def __init__(self, val, next):
        self.val = val  # element at the node
        self.next = next  # next node reference

    def __str__(self):
        return str(self.val)

    __repr__ = __str__

Я пытаюсь вернуть строковое представление списка узлов в обратном порядке, но с использованием рекурсии.Он не изменяет узел, а только возвращает строковое представление узла.Я также хочу отформатировать его правильно.

Поэтому, если узел был:

{1, 2, 3}

Я хочу использовать рекурсивную функцию, чтобы он мог печатать:

3, 2, 1

У меня есть следующая функция:

def reverse_str(node):
    str_rep = ""
    if node is None:
        return str_rep
    else:
        str_rep = str(node.val)
        # For str(node.val), there is a class function that returns 
        # str(self.val)
        str_rep = reverse_str(node.next) + str_rep + ", "

Если узел был:

{1, 2, 3}

Мой результат:

3, 2, 1, # Trailing comma

Кажется, я не могу понять,способ избавиться от запятой, оставляя функцию рекурсивной.Вероятно, это простой оператор if / else, но я не уверен, что нужно проверить, чтобы увидеть, является ли это первым головным узлом.Я также не хочу изменять класс Node.

Любые предложения или идеи будут полезны!Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы можете создать атрибут, который будет действовать как «помощник» для генерации списка узлов, а затем использовать метод __str__ для возврата строки:

class _List:
  def __init__(self, _val=None):
    self.val, self._next = _val, None
  def insert_val(self, _val):
    if self.val is None:
      self.val = _val
    else:
      getattr(self._next, 'insert_val', lambda x:setattr(self, '_next', _List(x)))(_val)
  @property
  def to_list(self):
    return [self.val, *getattr(self._next, 'to_list', [])]
  def __str__(self):
    return ', '.join(list(map(str, self.to_list))[::-1])

l = _List()
for i in range(10):
  l.insert_val(i)

print(l)

Вывод:

9, 8, 7, 6, 5, 4, 3, 2, 1, 0
0 голосов
/ 19 сентября 2018

Необходимо проверить случай, когда узел имеет значение None (т. Е. Предыдущий узел был последним), и обработать этот случай по-разному, например:

def reverse_str(node):
    if node is None:
        return None
    else:
        str_rep = str(node.val)
        # For str(node.val), there is a class function that returns
        # str(self.val)
        s = reverse_str(node.next)
        str_rep = s + ", " + str_rep if s else str_rep
        return str_rep

three = LinkedNode(3, None)
two = LinkedNode(2, three)
one = LinkedNode(1, two)

print(reverse_str(one))

Выход

3, 2, 1
0 голосов
/ 19 сентября 2018

Скорее всего, вам нужно ','.join(a, b), но более глубокие проблемы с кодом лежат в другом месте, см. Комментарии.

По сути, вы пытаетесь создать цепочку, но python не слишком хорош для хранения указателей, в отличие от C. Если вы не используете класс, считайте свою структуру данных списком.из словарей например.

...