力扣 92 反转链表Ⅱ

反转链表请参考前一篇文章。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
// 这里以输入为 [1,2,3,4,5]  left = 2 ,right = 4为例。
 // 本题另外注意的是利用了分治的思想,把大问题变成小问题来求解,(直到翻转区间中的链表不简单,可以先令left = 0;(这里需要控制的条件是把右边区间外的最一个结点(1)指向区间中的最后一个结点(4)(代码中①位置的表示))这样就变成了反转前n项的链表反转问题,再接着缩小问题规模,即在令right = 0;(这里需要控制的条件是区间中的第一个结点(2)指向右边区间外的第一个结点(5),(代码中②③位置的表示)这样就变成了最基本的链表反转问题。

struct ListNode *temp = NULL;  //新定义一个指针用于保存结点(5)    ②
struct ListNode* reverse(struct ListNode* head , int n)
{
    //struct ListNode *temp = NULL;                   //递归函数中不能定义变量。
    if(n == 1){
        temp = head->next;      // ③
        return head;
    }
    struct ListNode *last = reverse(head->next,n-1);
    head->next->next = head;
    head->next = temp;
    return last;
}

struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
    if(left == 1) return reverse(head,right);
    head->next = reverseBetween(head->next,left-1,right-1); //①
    return head;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值