我有一个类节点:
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类。
任何建议或想法都会有所帮助!谢谢。
答案 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