问题描述
我创建了一个递归函数,该函数可以反转链表的顺序。例如,如果一个链表最初是[3,2,1],则该函数将返回[1,3]。
下面是代码:
class node:
def __init__(self,val,next=None):
self.val=val
self.next=next
def recursive(l3):
if l3.next is None:
return l3
else:
a=l3
head=recursive(l3.next)
b=head
while b.next is not None:
b=b.next
b.next=a
b.next.next=None
return head
a=node(1,node(2))
但是,当我尝试recursive(a)==recursive(a)
时,它返回false。当我本质上将一个与自己进行比较时,两者为何不相等。您能帮我理解为什么两个变量不相同吗?
谢谢
解决方法
问题确实是可变性。您需要考虑recursive
对链接列表的作用。除了返回“反向链接列表”之外,它还对原始列表进行了变异。它发生在在这里:
a=l3
...
b.next=a
b.next.next=None
实际上,这与l3.next = None
相同。
最重要的是,您构建的两个链表共享相同的节点c
,并且也可以通过调用recursive
进行突变(重新分配其next
)。
实际上,在调用recursive(a)
之后,您可以看到c.next
指向node(2)
而不是None
。呼叫recursive(b)
后,c.next
指向node(4)
。
因此,如果您在recursive
或 node(1)
上调用a
,但在{{ 1}}和 then 在b
上,它先返回a
,然后再返回b
。
编辑:您将问题更改为仅使用一个变量,这使其更加显而易见:问题在于每个调用都使参数变了。