使用递归以相反的顺序返回节点类的字符串表示形式

时间:2018-09-18 21:47:21

标签: python string recursion reverse

我有一个类节点:

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 :(得分:0)

就像您需要','.join(a, b)一样,但是代码的更深层问题在其他地方,请参见注释。

基本上,您正在尝试建立一个链,但是与C相比,python并不适合用于保存指针,而不是过于复杂。除非必须使用类,否则将您的数据结构看作是字典的列表例。

答案 1 :(得分:0)

您可以创建一个充当“帮助器”的属性来生成节点列表,然后使用__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

答案 2 :(得分:0)

您需要检查节点为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