详解Java递归法实现反转链表(LeetCode 206. 反转链表)

详解Java递归法实现反转链表(LeetCode 206. 反转链表)

/*
 * 示例:
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 * 
 * 链接:https://leetcode-cn.com/problems/reverse-linked-list/
 */

// ListNode的数据结构
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {this.val = val;}
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

public class Solution {

    // 单链表反转
    public ListNode reverseList(ListNode head) {
        // 递归:
        // node1 -> node2 -> node3 -> node4 -> node5  // 先递归到最内层,并return head, return 后 head 位于 node4
        // node1 -> node2 -> node3 -> node4 <- node5  // node4.next.next = node4, 即node5.next = node4; node4.next = null
        // node1 -> node2 -> node3 <- node4 <- node5  // node3.next.next = node3, 即node4.next = node3; node3.next = null
        // node1 -> node2 <- node3 <- node4 <- node5  // node2.next.next = node2, 即node3.next = node2; node2.next = null
        // node1 <- node2 <- node3 <- node4 <- node5  // node1.next.next = node1, 即node2.next = node1; node1.next = null
        // 此时,node1 成为尾结点, 递归结束

        if (head == null || head.next == null) { // 为什么需要这两个判断呢?
            return head;
        }
        ListNode headNode = reverseList(head.next); // 递归到最内层,由内往外,由后往前 计算
        head.next.next = head;  // 因为这里需要 head.next == null 的判断
        head.next = null;       // 因为这里需要 head == null 的判断
        return headNode;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值