调用LinkedList类reverse方法时赋值无效,原因何在?
问题分析:为什么
c = a.reverse()得到None,而原链表被修改? 嘿,这问题其实挺典型的,核心原因就藏在你写的LinkedList.reverse()方法里——它是原地修改当前链表实例,而且没有返回任何有效结果。Python里如果函数没写显式的return语句,默认会返回None,所以c自然就被赋值成None了,而原链表a因为被原地修改,也就变成反转后的状态啦。
咱们一步步拆解来看:
1. 原地修改的reverse方法问题所在
你的LinkedList.reverse()方法内部,通过调整节点的next指针,直接把当前链表(也就是a)的头节点替换成了反转后的头节点(self.head = prev),整个过程都是在修改a自身的内部状态。但方法最后只有打印操作,没有返回任何值,所以当你执行c = a.reverse()时,reverse()做完修改后返回的是默认的None,c自然就是None,而a已经变成反转后的链表了。
如何让reverse()返回预期结果?
如果你希望c能拿到反转后的链表(和a指向同一个实例),只需要在reverse()方法最后加上return self就行,修改后的代码如下:
def reverse(self): if self.head is None: return self # 空链表直接返回自身 curr = self.head prev = None while curr: next = curr.next curr.next = prev prev = curr curr = next self.head = prev # 保留你的打印逻辑也没问题,不影响返回值 print(self.head.value) print(self.head.next.value) print(self.head.next.next.value) return self # 关键:返回当前链表实例
这样执行c = a.reverse()后,c和a都会指向反转后的链表,打印出来都是[5,4,3,2,1]。
2. 不修改原链表的方案:使用独立的reverse函数
如果你想让原链表a保持原样,同时得到一个反转后的新链表c,那你已经写好的那个独立reverse函数就正好适用!它会创建一个新的LinkedList实例,把原链表的节点反转后放到新链表中,最后返回新链表。
调用方式改成这样即可:
c = reverse(a)
此时a还是原来的[1,2,3,4,5],c是反转后的[5,4,3,2,1]。
两种方式的对比
- 原地修改的
reverse:节省内存,不需要额外创建链表,但会改变原链表的状态,适合不需要保留原链表的场景。 - 独立的
reverse函数:不影响原链表,但需要额外内存存储新链表,适合需要同时保留原链表和反转结果的场景。
内容的提问来源于stack exchange,提问作者vkaul11
相关产品推荐
相关产品推荐

