用递归反转单链表

用递归反转单链表

首先考虑递归的边界条件,什么情况下不用反转

当只有一个结点的时候
从前往后走,到只剩最后一个结点时返回该结点,作为新链表的头结点
所以代码应该是是这样的

public static void reverse(Node head){
    if(head.next==null) return head;
    Node reversed=reverse(head.next);
    ......
}

那么接下来就应该找递推公式了

递推公式怎么求呢
比方说 h1.next=h2 h2.next=null;
也就是说h1指向h2,而h2指向null,那么我们怎么反转它呢
应该是 h2.next=h1 h1.next=null
而h2=h1.next 就可以写成 h1.next.next=h1;h1.next=null;
那么我们的递推公式就求出来了
代码就应该是

public static void reverse(Node head){
    if(head.next==null) return head;
    Node reversed=reverse(head.next);
    head.next.next = head;  
    head.next = null;
    return reversed;
}

刚开始一直有疑问,就是当第一次从递归出来时,head不是应该指向最后一个结点吗,那递推公式怎么求,在这块想半天,然后又自己debug,才终于明白。
首先边界条件就是return最后一个结点,那么head等于什么时return的最后一个结点呢?
假如现在就是那个第一次返回的head1,在这个head1上调用reverse(head1.next),然后head1.next被当作参数传进去了。
为了方便理解我们让head2=head1.next
首先判断head2.next==null,发现正确return head2;,这时head1.next.next=head1; head1.next=null;
也可以理解为head2.next=head1,head1.next=null;
然后就都一样了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值