【递归】 92. 反转链表 II

本文介绍了如何使用递归在Java中实现链表的反转,特别是通过`reverseBetween`方法处理指定范围的反转,以及`reverseN`方法处理链表开头n个元素的反转,详细阐述了链表节点结构和递归过程。
摘要由CSDN通过智能技术生成

92. 反转链表 II

解题思路

  • 定义了单链表节点的数据结构,包含整数值 val 和指向下一个节点的引用 next。

  • 在 Solution 类中,定义了一个类变量 successor,用于保存当前节点的后继节点。

  • 实现了 reverseBetween 方法,该方法通过递归实现反转链表中指定范围 [left, right] 的节点。如果 left 等于 1,表示从链表头部开始反转,调用 reverseN 方法。

  • reverseN 方法用于翻转链表开头的 n 个元素。递归的终止条件是 n 等于 1,此时保存当前节点的后继节点,并返回当前节点。在递归过程中,将链表中的相邻节点反转,确保正确的连接关系。

  • 在 reverseN 方法中,通过递归调用获得新的头节点 last,然后调整相邻节点的指向关系,将当前节点 head 的 next 指针指向 successor,完成反转。

  • 返回反转后的链表的新头节点 last。

  • 总体思路是通过递归实现链表反转,其中 reverseBetween 方法用于处理整个范围的反转,而 reverseN 方法用于处理范围内开头的 n 个元素的反转。通过递归调用和相邻节点的指向关系调整,实现了链表的指定范围反转。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    ListNode successor = null;// 后驱节点

    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left == 1){
            return reverseN(head,right);
        }
        head.next = reverseBetween(head.next,left - 1,right - 1);
        return head;
    }

    // 翻转链表开头的n个元素
    ListNode reverseN(ListNode head,int n){
        if(n == 1){
            successor = head.next;// 保存第 n + 1个节点
            return head;
        }

        ListNode last = reverseN(head.next,n - 1);// 返回新的头节点
        head.next.next = head;// head作为新的尾节点
        head.next = successor;
        return last;
    }
}

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值