求助:递归实现链表按因子缩放函数测试出现Node对象异常
链表缩放函数递归实现问题排查
需求与示例
需要实现一个递归函数scale,输入链表和缩放因子,返回每个节点值按因子缩放后的新链表。示例如下:
scale(linkify([1, 2, 3]), 2) # 预期输出:2 -> 4 -> 6 -> None
已实现代码
列表转链表函数linkify
from typing import Optional class Node: def __init__(self, data, next=None): self.data = data self.next = next def linkify(item: list[int]) -> Optional[Node]: """Return a Linked List of Nodes with same values and same order as input list.""" if len(item) == 0: return None elif len(item) == 1: return Node(item[0], None) else: return Node(item[0], linkify(item[1:]))
递归实现的scale函数
def scale(head: Optional[Node], factor: int) -> Optional[Node]: """Returns new linked list of nodes where each value in original list is scaled by scaling factor.""" if head is None: return None else: return Node(head.data * factor, scale(head.next, factor))
问题现象
测试时出现类似exercises.ex11.linked_list.Node object at 0x0000013392C97C10>的输出,且测试用例断言失败。测试用例如下:
def test_scale_factor() -> None: linked_list: list[int] = [1, 2, 3] linked_list_2: list[int] = [2, 4, 6] assert is_equal(scale(linkify(linked_list), 2), linkify(linked_list_2))
排查与解决方案
1. 输出显示问题
你看到的Node object at ...是Python默认打印对象的格式,并非scale函数逻辑错误,而是Node类未自定义字符串输出方法。添加以下方法到Node类即可显示预期的链表格式:
def __repr__(self): current = self parts = [] while current: parts.append(str(current.data)) current = current.next parts.append("None") return " -> ".join(parts)
2. 断言失败的核心原因
如果测试断言失败,大概率是is_equal函数的实现问题。确保它是递归比较每个节点的数据和后续节点,而非直接比较对象身份。正确的is_equal实现如下:
def is_equal(l1: Optional[Node], l2: Optional[Node]) -> bool: if l1 is None and l2 is None: return True if l1 is None or l2 is None: return False return l1.data == l2.data and is_equal(l1.next, l2.next)
3. 验证scale函数逻辑
你的scale函数递归逻辑是正确的:
- 终止条件:输入链表为空时返回
None - 递归步骤:创建新节点,值为原节点数据乘缩放因子,
next指向递归处理下一个节点后的结果
只要修复上述两个问题,测试用例即可正常通过。
内容的提问来源于stack exchange,提问作者A Ab
相关产品推荐
相关产品推荐

