Leetcode反转区间链表递归法研究

本文介绍了如何使用C++递归方法实现ListNode结构的区间反转,涉及`reverse`函数和`reverseBetween`函数,重点在于理解递归策略和区间反转的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

摘要:对递归解法的终极研究

C++代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* temp = NULL;
    ListNode* reverse(ListNode* head, int n){
        if(n==1){
            temp = head->next;
            return head;
        }
        ListNode* node = reverse(head->next,n-1);
        head->next->next = head;
        head->next = temp;
        return node;
    }
    ListNode* reverseBetween(ListNode* head, int m, int n){
        if(m==1)
            return reverse(head, n);
        ListNode* node = reverseBetween(head->next,m-1,n-1);
        head->next = node;
        return head;
    }
};

第一步:首先研究反转

    ListNode* temp = NULL;
    ListNode* reverse(ListNode* head, int n){
        if(n==1){
            temp = head->next;
            return head;
        }
        ListNode* node = reverse(head->next,n-1);
        head->next->next = head;
        head->next = temp;
        return node;
    }

关于递归回溯可查看之前的文章,这个函数的作用就是返回head和n之间的列表反转列表

第二步:区间反转

    ListNode* reverseBetween(ListNode* head, int m, int n){
        if(m==1)
            return reverse(head, n);
        ListNode* node = reverseBetween(head->next,m-1,n-1);
        head->next = node;
        return head;
    }

这里依然用递归,分为两步,第一步递归前,当m=1时,返回reverse(head,n),递归后m‘=1时,此时head‘与m’重合,node返回reverse(head',n'),也就是原[m,n]区间反转,然后递归回溯,递补上m之前的节点即可

总结:区间反转理解难度在于将头节点和m节点重合,进而将区间反转问题转换为普通的反转问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值