首页 > 其他分享 >92. 反转链表 II

92. 反转链表 II

时间:2024-12-04 22:32:16浏览次数:7  
标签:II ListNode 反转 next 链表 92 beforeleft 节点

链接:92. 反转链表 II - 力扣(LeetCode)

方法一:需要分类讨论

/*总体思路就是:
    pleft指向left所在的节点
    pright指向right所在的节点
    beforeleft指向left的前一个节点,或者叫做前面没有反转部分的尾节点
    behindright指向right的后一个节点,或者叫做后面没有反转部分的头节点
    然后将前后部分不反转的链表和反转的链表截断
    然后将pleft和pright之间的链表反转
    然后再将所有部分的链表连接起来
    注意在连接的时候需要分类讨论
    */
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        //相等相当于没有反转直接返回
        if(left==right)return head;
        ListNode* pleft=nullptr;
        ListNode* pright=nullptr;
        ListNode* beforeleft=nullptr;
        ListNode* behindright=nullptr;
        ListNode* p=head;
        int index=1;
        while(p)
        {
            if(index==left)pleft=p;
            if(index==left-1)beforeleft=p;
            if(index==right)
            {
                pright=p;
                break;
            }
            p=p->next;
            index++;
        }
        //满足if就是让前面不用反转的部分和反转的部分截断
        if(beforeleft!=nullptr)beforeleft->next=nullptr;
        behindright=pright->next;
        //截断要反转的链表和后面不反转的链表
        pright->next=nullptr;
        //p1接收反转后的链表的头结点
        ListNode* p1=nullptr;
        ListNode* p2=pleft;
        //p3接收反转后的链表的尾节点
        ListNode* p3=pleft;
        while(pleft)
        {
            pleft=pleft->next;
            p2->next=p1;
            p1=p2;
            p2=pleft;
        }
        //让反转后的链表的尾节点p3的下一个节点指向behindright
        p3->next=behindright;
        //如果beforeleft为空,那么p1就是整个链表的头结点
        if(!beforeleft)return p1;
        //否则就把前面没有反转部分的尾节点beforeleft的下一个节点指向p1
        beforeleft->next=p1;
        return head;
    }

方法二:不需要分类讨论,定义一个虚拟节点来解决

ListNode* reverseBetween(ListNode* head, int left, int right) {
        //相等相当于没有反转直接返回
        if(left==right)return head;
        ListNode* dummy = new ListNode(0); // 创建虚拟头节点
        dummy->next = head;
        ListNode* pleft=nullptr;
        ListNode* pright=nullptr;
        ListNode* beforeleft=dummy;//初始化为虚拟头节点
        ListNode* behindright=nullptr;
        ListNode* p=head;
        int index=1;
        while(p)
        {
            if(index==left)pleft=p;
            if(index==left-1)beforeleft=p;
            if(index==right)
            {
                pright=p;
                break;
            }
            p=p->next;
            index++;
        }
        //截断要反转的链表和后面不反转的链表
        behindright=pright->next;
        pright->next=nullptr;
        //反转链表
        //p1接收反转后的链表的头结点
        ListNode* p1=nullptr;
        ListNode* p2=pleft;
        //p3接收反转后的链表的尾节点
        ListNode* p3=pleft;
        while(pleft)
        {
            pleft=pleft->next;
            p2->next=p1;
            p1=p2;
            p2=pleft;
        }
        //让反转后的链表的尾节点p3的下一个节点指向behindright
        p3->next=behindright;
        //将前面没有反转部分的尾节点beforeleft指向反转后的链表头节点
        //因为我们通过定义一个虚节点dummy,然后将dummy->next = head;
        //然后我们给beforeleft赋值为dummy
        //那么当beforeleft不为dummy的时候,就说明前面不反转部分是有节点的
        //然后beforeleft代表这部分的尾节点,那么就把反转后的链表的头结点p1赋值给beforeleft->next
        //如果beforeleft为dummy的时,说明前面不反转的部分是没有节点的
        //那么也可以让反转后的链表的头结点p1赋值给beforeleft->next
        //这样通过虚节点就可以解决对beforeleft分类讨论的问题
        beforeleft->next = p1;
        return dummy->next;
    }

标签:II,ListNode,反转,next,链表,92,beforeleft,节点
From: https://blog.csdn.net/A687479A/article/details/144251475

相关文章

  • go语言实现双向循环链表
    双向循环链表简介双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。//--------------------------------------......
  • js.重排链表
    链接:143.重排链表-力扣(LeetCode)题目:给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例......
  • 代码随想录算法训练营第二十二天|77.组合、216.组合总和iii、17.电话号码的字母组合
    题号来自leetcode77.组合回溯算法三部曲,回溯算法的理论基础:代码随想录1.递归函数的传参和返回值:用两个全局变量List<List<Interger>>result和List<Integer>path来分别存放最终结果和每次符合条件的结果。符合题目要求的n和k肯定是要传入的,还要再定义一个startIndex,这个参......
  • 【Leetcode Top 100】138. 随机链表的复制
    问题背景给你一个长度为nnn的链表,每个节点包含一个额外增加的随机指针ra......
  • KIOXIA CD8 CM7系列企业级SSD区别在哪里?KCD81RUG1T92 KCMY1RUG1T92 PM9A3
    我们来看一下,KIOXIACD8系列、CM7系列和三星PM9A3系列,U.2接口的参数介绍产品型号KCD81RUG1T92KCMY1RUG1T92MZQL21T9HCJR-00A07品牌铠侠铠侠三星系列CD8-RCM7-RPM9A3容量1,920GB1,920GB1,920GB尺寸2.5-inch,15mmthickness2.5-inch2.5-inch,15mmthickness接口U.2U.2/U.3*......
  • 代码随想录算法训练营第三十六天|LeetCode1049.最后一块石头的重量II、LeetCode494.目
    前言打卡代码随想录算法训练营第49期第三十六天...φ(0 ̄*)啦啦啦_φ(* ̄0 ̄)′首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。Le......
  • 网站iis怎么修改网站内容,如何在IIS管理器中修改网站内容
    在IIS管理器中修改网站内容并不是直接的功能,但可以通过以下步骤间接实现:备份网站数据:在进行任何修改之前,务必先备份网站的数据和文件,以防出现问题。使用FTP客户端:使用FTP客户端(如FileZilla)连接到服务器。找到需要修改的文件,下载到本地进行编辑。使用代码编辑器:......
  • 【力扣热题100】—— Day3.反转链表
    你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了                                                                                        —— 24.12.2206.反转链表......
  • 7-192 浪漫的表白
    有一个帅小伙一直暗恋一个女孩,但他还是没有勇气向她表白“我爱你”,更别说“某某某,我爱你,如果非要在这份‘爱’上加一个期限的话,那就是一万年”这类肉麻的话,生怕说了后会是“落花有意流水无情”,连朋友都无法做。不过,在经过一阵思想斗争以后,最后终于还是鼓起勇气向那个女孩进行了......
  • 链表操作
    [Algo]链表操作链表节点类型定义structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};1.反转链表//1.反转链表ListNode*reverseList(ListNode*head){ListNode*pre=nullptr,*next=nullptr;while(......