欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-09 14:23:29
...

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

已知单链表,求反转:
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下去嘛。

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

相关标签: 算法数据结构