首页 > 试题广场 >

链表内指定区间反转

[编程题]链表内指定区间反转
  • 热度指数:352345 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 ,空间复杂度
例如:
给出的链表为 , ,
返回 .

数据范围: 链表长度 ,链表中每个节点的值满足
要求:时间复杂度  ,空间复杂度
进阶:时间复杂度 ,空间复杂度
示例1

输入

{1,2,3,4,5},2,4

输出

{1,4,3,2,5}
示例2

输入

{5},1,1

输出

{5}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
头像 Gemini48
发表于 2021-07-11 16:05:39
精华题解 解法一:双指针(两次遍历) 思路步骤: 要反转局部链表,可以将该局部部分当作完整链表进行反转 再将已经反转好的局部链表与其他节点建立连接,重构链表 建议使用虚拟头节点的技巧,可以避免对头节点复杂的分类考虑,简化操作。 反转前后图示: 配图说明: 反转步骤: Java参考代码: 展开全文
头像 牛客题解官
发表于 2022-04-22 10:59:30
精华题解 题目的主要信息: 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转 链表其他部分不变,返回头节点 举一反三: 学习完本题的思路你可以解决如下题目: BM1.反转链表 BM3.链表中的节点每k个一组翻转 方法一:头插法迭代(推荐使用) 思路: 在学会了BM1.反转链表之后,要解决 展开全文
头像 认认真真coding
发表于 2021-07-15 10:38:29
精华题解 题目描述将一个链表m位置到n位置之间的区间反转,要求时间复杂度 O(n),空间复杂度O(1)。例如:给出的链表为 1→2→3→4→5→NULL, m=2,n=4返回1→4→3→2→5→NULL.注意:给出的m,n满足以下条件:1≤m≤n≤链表长度 (参考杭电 De梦的题解) 方法一:直接暴力求解 求 展开全文
头像 漫漫云天自翱翔
发表于 2021-07-16 01:57:14
精华题解 题解一:迭代翻转 题解思路 : 建立一个空白节点指向头节点,然后翻转[m,n]内的节点。 参数分析: p:指向m前一个节点,q指向第n个节点。p1,p2用于翻转. 图示:复杂度分析: 时间复杂度:O(N),最多遍历整个链表 空间 展开全文
头像 南七技校
发表于 2021-07-29 18:32:10
其实我以前还是挺怕做链表的题目的,但是熟能生巧之后还是会理解一些,不要怕指针太多弄的自己搞不清楚在干什么; 首先还是制造一个哨兵伪节点来避免头节点的分类讨论 然后找到反转节点前一个位置的节点用pre指过去 再者,就是运用头插法来反转链表了,pre后面是cur,这里需要不断地把cur后面的节点移动到p 展开全文
头像 失眠大师
发表于 2021-02-17 16:33:19
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } * 展开全文
头像 程序员学长
发表于 2021-11-02 14:10:09
更多题解,请关注公众号:程序员学长,让你进大厂不走弯路 链表内指定区间反转 问题描述 LeetCode 92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返 展开全文
头像 王清楚
发表于 2021-03-19 15:53:09
做这道题目之前可以先看一下 NC78 反转链表 https://blog.nowcoder.net/n/31e6abf3dd5d4970a03f7a483ca8e0ab先举一个例子:原链表:m = 2 ,n = 4反转后 观察可以发现我们需要进行的步骤有以下三条: 从 𝑚+1 到 𝑛 的这些 展开全文
头像 牛客410632071号
发表于 2022-04-04 15:07:23
* struct ListNode { * int val; * struct ListNode *next; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 展开全文
头像 Sinusoid
发表于 2022-03-01 11:00:31
方法一:栈 解题思路: 判断参数head是否为空,若空则直接返回;判断m是否等于n,相等则无需进行操作,直接返回; 由于题目给出的链表是不带头结点的,所以令i=1,work=head,首先用work指针,从链表头部开始进行遍历,遍历前m-1元素,最后一次遍 展开全文
头像 我是愿至安
发表于 2022-02-10 22:45:20
核心思想 借鉴了漫漫云天自翱翔的父函数通过递归,m和n减一的思路来确定反转部分 最初我的思路是通过一遍循环,找出来开始和反转的结点,局部反转的独立函数大同小异,因为调试的时间有点长,就暂时放弃了我分享的原因是因为,题解里没有c的实现 父函数递归入栈,找到实际要反转的结点 根据head-> 展开全文
头像 摸鱼学大师
发表于 2021-12-06 11:26:04
题目的主要信息: 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转 进阶要求:时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1) 方法一:递归 具体做法: 如果m == 1,就相当于反转链表的前 n 元素; 如果 m != 1我们把 head 的索引视为 展开全文
头像 Eagle-Q
发表于 2020-09-03 10:47:20
class Solution {public: ListNode* reverseBetween(ListNode* head, int m, int n) { if(m==n) return head; int i=1; ListNode *phead=head; 展开全文
头像 牛客592373876号
发表于 2022-03-19 13:31:09
首先需要找到第 m-1 和第 n+1 节点,分别用 start 和 end 保存 m - 1表示:开始反转的前一个节点,注意如果m = 1,那么从head节点就开始反转了,start就是null n + 1表示:结束反转的后一个节点,可能是一个节点,也可能是null,不过都一样 第一个for循环就是 展开全文