LeetCode -- 反转链表进阶

95 阅读1分钟

之前写过一个关于链表翻转问题的文章,在这篇文章中,关于反转链表,只有一个双指针的实现方式,在刷题时又遇到了另一个显得高大上的的解法(理解起来难,但是看起来很厉害的样子)-- 递归法。

题目要求

给定一个单链表的头结点head,长度为n,反转该链表后,返回新链表的表头。

我们先上代码,先目睹一下递归的优雅

// 递归翻转
public ListNode reverseList(ListNode head) {
    if(head == null || head.next == null){
        return head;
    }
    // 递归
    ListNode node = reverseList2(head.next);
    
    // 这里才是关键
    head.next.next = head;
    head.next = null;
    return node;
}

看了如上代码之后,我第一眼看上去,觉得这代码貌似有点bug,但是试验了一下又是对的,我不禁想了一下,为什么它能实现呢?

其实,他最关键的是在于,新链表与旧链表共享同一个尾节点。

看图

image.png

image.png

image.png

执行 head.next.next = head

image.png

执行 head.next = null;

image.png

此时,旧链表与新链表共享同一个尾部Node(4).并且执行return node;

image.png

执行 head.next.next = head

image.png

执行 head.next = null;

image.png

剩余步骤一致。。。