算法通关村第二天——反转链表二

目录

1.问题描述

2.解决思路

3.代码实现

4.总结

1.问题描述

        本体出自leetcode 92 反转链表Ⅱ,相比于反转链表Ⅰ,题目增加了两个输入变量left和right,要求反转的是链表的[left,right]区间。

2.解决思路

        由于要求是反转区间里面的节点,相比于反转整个链表,我们需要考虑的点也更多了,比如反转的区间是第一个怎么办?反转区间里面的,那么不是区间里面的节点该怎么考虑?是不是应该设置反转的前置节点?我们需要找到反转区间的第一个节点,反转后的下一个节点。把中间反转后,首尾相连即可。

3.代码实现

ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode *reverstart=NULL;//反转的起始节点
        ListNode *reverend=head;//反转的结尾节点
        ListNode *node=head;//用于遍历的节点,遍历至反转的第一个节点
        while(--left)
        {
            reverstart=node;//记录node的前一个节点
            node=node->next;
        }
        while(right--)
        {
            reverend=reverend->next;
        }
        ListNode* pre=nullptr;//用于反转的节点
        while(node!=reverend)
        {
            ListNode *nextnode=node->next;
            node->next=pre;
            pre=node;
            node=nextnode;
        }
        //如果reverstart!=nullptr说明需要反转的节点就是第一个
        if(reverstart!=nullptr)
        {
            reverstart->next=pre;
        }
        else
        {
            head=pre;
        }
        while(pre && pre->next)
        {
            pre=pre->next;
        }
        if(pre)
            pre->next=reverend;
        return head;
    }

4.总结

        虽然只相对于普通的反转链表只加了一个区间,但是也复杂了不少,尤其是reverstart节点那里需要注意判断,如果是第一个节点,那么最后返回的节点就不是head,应该是在链表区间反转前的第一个。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值