如何实现支持嵌套场景的Linked List类__str__方法?
解决Linked List的__str__方法嵌套链表格式化问题
你原来的__str__方法只能处理顶层的普通链表,遇到嵌套的Link节点就会失效——因为它没有考虑到self.first本身可能也是一个Link实例的情况。要满足那些嵌套测试用例,我们需要递归处理每个节点的first元素,并且在元素是Link类型时用括号包裹它的字符串结果。
修改后的完整代码
class Link(object): empty = () def __init__(self, first, rest=empty): self.first = first self.rest = rest def __str__(self): # 处理当前节点的first部分:如果是Link实例,就用括号包裹它的字符串 first_str = f'({str(self.first)})' if isinstance(self.first, Link) else str(self.first) # 如果是链表的最后一个节点,直接返回first的字符串 if self.rest is Link.empty: return first_str # 否则递归拼接当前节点和后续链表的字符串 return f'{first_str} -> {str(self.rest)}'
代码逻辑解释
- 处理当前节点的first:判断
self.first是否是Link对象,如果是,就递归调用它的__str__方法,再用括号把结果包起来;如果是普通数据(字符串、数字等),直接转成字符串即可。 - 判断是否为尾节点:如果
self.rest是Link.empty,说明这是链表的最后一个节点,直接返回当前first的字符串。 - 递归拼接后续链表:如果不是尾节点,就把当前first的字符串和后续链表的字符串用
->连接起来,递归处理后续部分。
验证测试用例
我们来逐个验证你给出的测试场景:
str(Link('Hello'))→'Hello'✅str(Link(1, Link(2)))→'1 -> 2'✅print(Link(1 / 2, Link(1 // 2)))→0.5 -> 0✅str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))))→'(1 -> 2 -> 3) -> 4 -> 5'✅print(Link(Link(Link(Link('Wow')))))→(((Wow)))✅print(Link(Link('a'), Link(Link('b'), Link(Link('c')))))→(a) -> (b) -> (c)✅
所有测试用例都能完美通过啦!
内容的提问来源于stack exchange,提问作者Chengming Gu
相关产品推荐
相关产品推荐

