LeetCode#206:反转链表之递归实现

不废话,直入主题(我是个很直接的人):

已知单链表,求反转:
1->2->3->4->5->null

期望效果:
null<-1<-2<-3<-4<-5

答题模版:


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        
    }
}

冷静分析:(自行脑补熊猫头抽烟表情包)
我们要反转,那么涉及到俩个元素,当前节点currentNode,和currentNode.next节点,我们主要做的,是将curremtNode.next.next = currnetNode。
结合递归,我们肯定是从1递归到2,从2递归到3这样,举个例:


reverseList (currentNode = 1) {
   saveNextNode = currentNode.mext = 2;
   reverseList(1.next = 2)
}

reverseList (currentNode = 2) {
   saveNextNode = currentNode.mext = 3;
   reverseList(2.next = 3)
}

reverseList (currentNode = 3) {
   saveNextNode = currentNode.mext = 4;
   reverseList(3.next =4)
}

reverseList (currentNode = 4){
   saveNextNode = currentNode.mext = 5;
   reverseList(4.next = 5)
   
}

......

然后加上:递归返回条件,就是12345顺序递归那个条件:

    //退出条件: < 1 - 2 - 3 - 4 - 5 - null >
    if (currhead == null || currhead.next == null) {
        return currhead;
    }

然后我们再加上这行:核心替换逻辑

   saveNextNode.next = currentNode;

最后再加上:斩断老的指向逻辑:

   currentNode.next = null; //斩断老的指向

于是有代码:

  private static ListNode reverse(ListNode currhead) {

        //退出条件: < 1 - 2 - 3 - 4 - 5 - null >
        if (currhead == null || currhead.next == null) {
            return currhead;
        }

        //12345
        ListNode nextNode = currhead.next;//保存下一个节点 4
        ListNode newHead = reverse(nextNode);//递归 5
        nextNode.next = currhead;//连上头与递归部分
        currhead.next = null;//调整尾部
        return newHead;//返回头节点
    }

最后解释:
这个newHead,是返回到新的头节点,细品这个newHead,其实他就在第一次的时候用到了,之后对链表对改变并没有再用到这个newHead,只是一直传递到新的结尾处。至于为什么要返回这个头节点,只能说是惯例吧,一个链表肯定是先知道其head才好next下去嘛。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值