首页 > 其他分享 >反转链表指定区间

反转链表指定区间

时间:2023-12-26 22:55:24浏览次数:21  
标签:head ListNode 反转 指定 next 链表 return end left

描述

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为
1→2→3→4→5→NULL,
m=2,n=4,
返回
1→4→3→2→5→NULL.

数据范围: 链表长度 0<size≤1000,0<m≤n≤size,链表中每个节点的值满足
要求:时间复杂度 O(n) ,空间复杂度 O(n)
进阶:时间复杂度 O(n),空间复杂度 O(1)

/**
 * 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* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        if(!head) return head;
        if(m <= 0 || n <= 0) return head;
        if(m >= n) return head;
        ListNode* left = head;
        ListNode* right = NULL;
        ListNode* begin = head;
        ListNode* end = head;
        if(m == 1)
        {
            left = NULL;
            begin = head;
        }
        else
        {
            while((m > 2) && left)
            {
                left = left->next;
                m--;
            }
            if(!left) return head;
            begin = left->next;
            if(!begin) return head;
        }

        while(n > 1 && end)
        {
            end = end->next;
            n--;
        }
        if(!end) return head;
        right = end->next;
        ListNode* pre = NULL;
        ListNode* cur = begin;
        ListNode* next = NULL;
        while(cur != right)
        {
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        begin->next = right;
        if(left)
        {
            left->next = end;
        }
        else
        {
            head = end;
        }
        return head;
    }
};

标签:head,ListNode,反转,指定,next,链表,return,end,left
From: https://www.cnblogs.com/liubenben/p/17929561.html

相关文章

  • 【线性表】链表
    本来要先讲数组的,介于之前已经总结过可变数组vector了,故不再开一个专题去介绍用法和原理。但是要提一嘴:数组作为数据结构可以高效地存储和查询给定索引(下标)的数据,其时间复杂度均为O(1),因为这个性质,数组可以用来模拟其他很多数据结构,但是如果要将整个数组进行移位操作,例如在中间插......
  • 如何利用搜索引擎指定网站(指定网址前缀)进行关键词搜索
    参考:site:搜索运算符博客园之前是有第三方搜索引擎(Google)的查询入口的,现在更新后就没有这个入口了,不过这也比较好理解,毕竟这个Google的查询入口好多人是用不了的,于是这里就给出手动指定查询网址的前缀来进行关键词查询了。例子:......
  • 【Python】Python安装指定版本库
    Python安装指定版本库安装指定的版本库在平时代码开发中是很有必要的操作,毕竟有些库之间相互依赖,如果版本不在依赖的范围之内,我们安装的库会报安装的依赖版本有问题。先看一下命令:pipinstall库名=版本号1示例:pipinstallnumpy==1.21.51如果你下载库的速度比较慢或者没办法下......
  • fastadmin隐藏指定表格行的按钮
    一、隐藏修改,删除按钮(隐藏所有行)隐藏前修改代码varController={index:function(){//初始化表格参数配置Table.api.init({extend:{index_url:'department/index/index',ad......
  • VS2019,无法启动程序xxx.exe,系统找不到指定的文件,重新生成解决方案报错
     调试程序报错如图一、尝试重新生成解决方案二、如果生成解决方案也报错,重新安装.netSDK本人所用为VS2019,.net5,到官网下载.net5的SDK重新安装后,恢复正常,重新生成成功,启动调试成功。.net各版本下载地址:https://dotnet.microsoft.com/en-us/download/dotnet.net5下载地址:h......
  • 在linux中查看运行指定进程资源占用(cpu+gpu)
    在运行程序时有时候会需要查看资源占用,以方便部署在其他服务器上时进行参考。以下是总结了我在linux上查找程序进程资源的两种方法(cpu和gpu都有)。CPU1.查找进程号如果进程较多,输入ps-ef|grep+指令关键词进行搜索。如果运行的是python程序,可以输入ps-ef|greppytho......
  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
    在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。什么是控制反转?控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。与传统编程相比,传统编程中我们的自定义......
  • CSP-S 2023消消乐 字符串哈希做法and链表优化dp做法
    做完这题感觉整个人都升华了...打算说一下两种做法,字符串哈希和dp均可。dp则需要维护一个前向星去检索出第一个符合要求的位置。题解明天补,先写高数了。#include<bits/stdc++.h>#defineintlonglong#defineullunsignedlonglong#definerep(i,a,b)for(inti=(a);i<......
  • 『LeetCode』7. 整数反转 Reverse Integer
    题目描述给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[−231,231−1],就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:输入:x......
  • C++简单实现list链表数据结构(一)
    链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域C++STL中的链表是一个双向循环链表由于链表的存储方式并不是连续的内存空......