如何验证链表pop函数返回值的正确性?
问题解析与解决方案
核心问题说明
- 外部访问
current报错:current是pop函数内部的局部变量,函数执行完毕后局部变量会被销毁,外部作用域根本不存在这个变量,所以会抛出current is not defined错误。 - 打印
mylist.pop()显示对象内存地址:你返回的是完整的Node对象,Python默认会打印对象的类型和内存地址,而不是节点存储的数据。 - 你函数内通过
print('Popped item is: %d' % (current.data))已经能正确输出最后一个节点的数据,说明你定位的current确实是链表的最后一个节点,逻辑是对的,只是返回值的形式或者后续访问方式需要调整。
针对性修改方案
1. 让pop返回节点的数据(和Python内置列表pop()行为一致)
修改pop函数的返回语句,从返回current改为返回节点的数据:
def pop(self): # 原有代码... return current.getData() # 或者直接 return current.data
这样执行print(mylist.pop())时,就会直接输出节点存储的数值,而不是对象地址。
2. 若需返回Node对象,但希望打印时显示数据
给Node类添加__str__方法,自定义对象的打印内容:
class Node: def __init__(self, initdata): self.data = initdata self.next = None # 其他原有方法... def __str__(self): return str(self.data)
之后执行print(mylist.pop())就会直接打印节点的数据,而不是内存地址。
3. 修复边界情况的bug
当前代码在链表为空或只有一个节点时会报错,补充判断逻辑:
def pop(self): # 处理空链表 if self.head is None: raise IndexError("pop from empty list") print(f'Original Linked List: {self}') current = self.head previous = None while current.getNext() is not None: previous = current current = current.getNext() print('Popped item is: %d' % (current.data)) # 处理只有一个节点的情况 if previous is None: self.head = None else: previous.setNext(current.getNext()) print(f'New Linked List after pop: {self}') return current.data # 或返回current,按需选择
内容的提问来源于stack exchange,提问作者Prathamesh Sawant
相关产品推荐
相关产品推荐

