力扣刷题——92.反转链表||

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

要解出这道题,我们需要先找到要操作的第left个节点p1和它的下一个节点p2,并记录下第left-1个节点p0备用。然后利用整体反转链表的方法在循环中不断改变节点指向,直到p1遍历到第right-1个节点。

 ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode dummy(0,head);
        ListNode* p0=&dummy;
        for(int i=0;i<left-1;i++)
        {
            p0=p0->next;
        }
        ListNode *p1=nullptr;
        ListNode *p2=p0->next;
        for(int i=0;i<right-left+1;i++)
        {
            ListNode *p3=p2->next;
            p2->next=p1;
            p1=p2;
            p2=p3;
        }

        p0->next->next=p2;
        p0->next=p1;
        return dummy.next;
    }

*p0->next->next=p2;以及p0->next=p1;的原因:

由图可知,在进行完最后一次循环后,p1指向了第right-1个节点,p2指向了第right个节点。此时只是将要操作的部分链表内部反转了,要将它们在链表中整体反转过来,就要将我们最初记录下来的p0节点指向这个部分链表反转后的“头节点”,也就是p1。不过我们要先将这部分链表的“尾节点”p1->next接到第right个节点前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值