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

链表内指定区间反转

时间:2023-05-03 21:46:45浏览次数:31  
标签:pre ListNode temp int 反转 指定 next 链表 翻转

  • 描述
将一个节点数为 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,链表中每个节点的值满足∣val∣≤1000 要求:时间复杂度 O(n) ,空间复杂度 O(n) 进阶:时间复杂度 O(n),空间复杂度  O(1)  
  • 示例1
输入: {1,2,3,4,5},2,4 返回值: {1,4,3,2,5}
  • 示例2
输入: {5},1,1 返回值: {5}  
  • 算法思想
首先需要找到开始翻转的节点以及其前驱。找到后指针的指向情况如下图。

接下来进行以下步骤

cur->next=temp->next

temp->next=pre->next

pre->next=temp

即如下图所示

翻转完后为

这样就做到了2,3之间的局部翻转,需要注意的是pre与cur所指向的元素从始至终都没有变化,temp始终指向cur的后继。

接下来再做2,3,4之间的翻转

仍然执行以下步骤

cur->next=temp->next

temp->next=pre->next

pre->next=temp

即如下图所示

 

 

翻转完后为

这样就完成了整体的反转。

 

  • 代码
 1 /**
 2  * struct ListNode {
 3  *    int val;
 4  *    struct ListNode *next;
 5  * };
 6  */
 7 
 8 #include <cstdlib>
 9 class Solution {
10 public:
11     /**
12      * 
13      * @param head ListNode类 
14      * @param m int整型 
15      * @param n int整型 
16      * @return ListNode类
17      */
18     ListNode* reverseBetween(ListNode* head, int m, int n) {
19        //创建一个头结点,便于处理开始翻转的位置在第一个节点的位置
20         ListNode *res=(ListNode*)malloc(sizeof(ListNode));
21         res->next=head;
22         ListNode* pre=res;
23         ListNode* cur=head;
24         //找到开始翻转的节点以及它的前驱
25         for(int i=1;i<m;i++){
26             pre=cur;
27             cur=cur->next;
28         }
29         //开始执行翻转
30         for(int i=m;i<n;i++){
31             ListNode *temp=cur->next;
32             cur->next=temp->next;
33             temp->next=pre->next;
34             pre->next=temp;
35         } 
36         //返回头节点
37         return res->next;
38     }
39 };

 

 

标签:pre,ListNode,temp,int,反转,指定,next,链表,翻转
From: https://www.cnblogs.com/yueshengd/p/17369717.html

相关文章

  • 剑指 Offer II 022. 链表中环的入口节点
    题目链接:剑指OfferII022.链表中环的入口节点方法一:哈希解题思路统计走过的节点,当第一次遇到重复的节点时,即为入口节点,否则为\(null\)。代码classSolution{public:ListNode*detectCycle(ListNode*head){unordered_map<ListNode*,bool>cache;......
  • linux下针对指定网卡限速 wondershaper
    背景由于路由器openwrt的限速不太好用,所以需要到设备上去进行限速设置,这里使用wondershaper使用下载安装wondershaperwgethttps://ghproxy.com/https://github.com/magnific0/wondershaper/archive/refs/heads/master.zip-Owondershaper.zipunzipwondershaper.zipcdwon......
  • chatGPT问答之 Webpack 5 多入口打包如何指定打包文件名规定的文件名
    前言chatGPT越来越令人惊奇,有一些答案在百度上搜半天却找不到你想要的,但与chatGPT的聊天中就可以非常快的得到你想要的结果,不得不说人工智能很好用下面就是我与chatGPT的聊天内容chatGPT问答之Webpack5多入口打包如何指定打包文件名规定的文件名问1:Webpack5多入口打包如......
  • LeetCode 链表操作
    21. 合并两个有序链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.......
  • typescript重写canvas --7.利用clip在指定区域绘图
    typescript重写canvas--7.利用clip在指定区域绘图1.使用canvas利用clip在指定区域绘图<!DOCTYPEHTML><html><head><metacharset="utf-8"/></head><body><canvasid="myCanvas"width="250"height="200......
  • 反转链表
    描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0≤n≤1000要求:空间复杂度 O(1) ,时间复杂度 O(n) 。 如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。 ......
  • java反转部分链表后记
    由于链表只是一个单向链表所以不能在一次循环之内就直接进行反转操作又因为只需要反转部分链表所以只要将链表遍历到需要反转的最后一位,剩下的不用管了于是我想到了在第一遍循环中用HashMap获取需要反转的链表的部分,键代表下标,值代表原先链表中val之后第二遍遍历时按照将值按......
  • ds:单链表
    写在前边:单链表:1.带头结点的单链表:L头指针->头结点(data域不存数据元素,只指向下一个元素)->a1->a2->..->NULL2.不带头结点的单链表:L头指针->a1->a2...->NULL以上两种区别在于:无头结点的单链表在进行插入/删除元素时要对i=1的情况做特殊处理 一、带头结点的单链表基本操作#......
  • c语言实现链表的基本操作——初始化,求长度,添加节点,遍历输出
    #include<stdio.h>#include<stdlib.h>//创建结构体并命名typedefstructNode //typedef用于对struct的重命名{ inti; structNode*next;}LNode,*LinkList; //定义一个结构体指针//链表初始化boolInistList(LinkListL){ L=(LNode*)malloc(sizeof(LNo......
  • 【Nginx】配置俩前端,指定路径的时候报错的原因
    #NGINX配置文件listen80;server_nameXX.XX.XX.XX;#配置前台的前端location/{indexindex.phpindex.htmlindex.htmdefault.phpdefault.htmdefault.html;root/www/wwwroot/uniapp/h5/;#root指令会在根目录查找index......