Python实现反转链表,递归实现的问题

对长度为5的链表进行反转,递归实现,到表尾的时候,返回值p.val为5,但是在递归返回后p.val为4,还有递归返回后不在newhead=recurse(p.next),不原路返回,这是为什么?

img

class ListNode:
    def __init__(self,x):
        self.val=x
        self.next=None
 
def recurse(p):    #递归,head为原链表的头结点,newhead为反转后链表的头结点
    i = 0
    if p is None:
        return 
    if p.next is None:
        print("aaaa{}".format(p.val))
        return p
    else:

        newhead=recurse(p.next)
        p.next.next=p
        p.next=None
        i += 1
        
    return newhead
    
head=ListNode(1)               #测试代码
p1=ListNode(2)                 # 建立链表1->2->3->4->None
p2=ListNode(3)
p3=ListNode(4)
p4=ListNode(5)
head.next=p1
p1.next=p2
p2.next=p3
p3.next=p4

p=recurse(head)           #输出链表4->3->2->1->None
while p:
    print (p.val)
    p=p.next

因为最后一个节点的next是None,直接返回return p。不再继续调用recurse(p.next)。
之后递归开始回溯,执行 newhead=recurse(p.next) 之后的代码
4到1要在递归回溯时输出

class ListNode:
    def __init__(self,x):
        self.val=x
        self.next=None
def recurse(p):    #递归,head为原链表的头结点,newhead为反转后链表的头结点
    i = 0
    if p is None:
        return
    if p.next is None:
        print("aaaa{}".format(p.val)) #输出5
        return p
    else:
        newhead=recurse(p.next)
        print("bbbb{}".format(p.val)) #递归回溯时输出4到1
        p.next.next=p
        p.next=None
        i += 1
    return newhead


head=ListNode(1)               #测试代码
p1=ListNode(2)                 # 建立链表1->2->3->4->None
p2=ListNode(3)
p3=ListNode(4)
p4=ListNode(5)
head.next=p1
p1.next=p2
p2.next=p3
p3.next=p4
p=recurse(head)           #输出链表4->3->2->1->None
while p:
    print (p.val)
    p=p.next

img

因为p.val为5的节点,next是None,第八行就返回了,不会执行到15行
如果你在15行打断点的话,当然就只能看到p.val为4的节点

有些想清楚了,最后一次递归传入的p.next是最后一个节点5,return的时候p.val是5,但是那个是最后一层递归p.val的值,为5。递归返回到上一层,那一层的p.val为4。虽然都是p,但是意义不一样,就是实参和形参名字一样,但是值不一样