自定义merge_list合并有序单链表时出现AttributeError问题求助
问题分析与修复方案
首先,咱们先定位你遇到的核心错误:AttributeError: type object '_Node' has no attribute '_element'。这是因为你在merge_list里错误地访问了类本身的属性,而非节点实例的属性——s1._Node是SList内部定义的_Node类,不是具体的节点对象,自然没有_element这个实例属性。
接下来咱们梳理merge_list里的所有问题,逐一修复:
1. 混淆链表对象与节点实例
你传入的s1、s2是SList类的实例,不是链表的节点。要遍历链表,得从它们的_head属性(指向第一个节点)开始,用节点的_next(或你定义的next()方法)来移动指针。
2. 错误初始化合并后的链表s3
原代码里s3._Node(None, None)这行完全没用,它只是创建了一个孤立的节点,没有和s3关联起来。我们需要给s3设置一个哨兵节点(哑节点),方便合并操作时不用处理头节点为空的边界情况。
3. 指针操作错误
prev = s3这行把prev指向了SList对象,而不是节点。应该让prev指向s3的哨兵节点,然后通过节点的_next属性(或set_next()方法)来连接新节点。
修复后的完整代码
先给SList添加一个打印链表的方法(方便测试)
在SList类里添加:
def __str__(self): elements = [] current = self._head while current is not None: elements.append(str(current.element())) current = current.next() return " -> ".join(elements)
修正后的merge_list函数
def merge_list(s1, s2): s3 = SList() # 创建哨兵节点作为s3的虚拟头 sentinel = s3._Node(None) s3._head = sentinel prev = sentinel # prev指向当前合并链表的最后一个节点 # 初始化两个链表的遍历指针 current1 = s1._head current2 = s2._head while current1 is not None and current2 is not None: # 用节点的element()方法获取元素值 if current1.element() <= current2.element(): prev.set_next(current1) current1 = current1.next() else: prev.set_next(current2) current2 = current2.next() prev = prev.next() # 拼接剩余的节点 if current1 is not None: prev.set_next(current1) else: prev.set_next(current2) # 返回合并后链表的真实头节点(跳过哨兵节点) s3._head = sentinel.next() return s3
修正后的测试代码
if __name__ == "__main__": s1 = SList() # 注意:insert_first是往头部插,所以插入顺序13,11,...1的话,链表是13->11->9->7->5->3->1 s1.insert_first(1) s1.insert_first(3) s1.insert_first(5) s1.insert_first(7) s1.insert_first(9) s1.insert_first(11) s1.insert_first(13) print(f"s1: {s1}") s2 = SList() s2.insert_first(2) s2.insert_first(4) s2.insert_first(6) print(f"s2: {s2}") merged_s = merge_list(s1, s2) print(f"合并后的链表: {merged_s}")
为什么这样修复?
- 用哨兵节点简化了合并逻辑,不用专门处理第一个节点的赋值问题;
- 用
current1和current2分别跟踪两个输入链表的当前节点,避免直接修改原链表的_head; - 严格使用
_Node类提供的element()、next()、set_next()方法来访问和修改节点属性,符合你封装的设计; - 最后把
s3的头节点设置为哨兵节点的下一个,去掉虚拟头,返回真实的合并链表。
现在运行代码,就能得到正确的合并结果啦!
内容的提问来源于stack exchange,提问作者JYP
相关产品推荐
相关产品推荐

