题目

92. 反转链表 II

思路1(迭代)

  • 将反转链表分成3个部分:前一段未反转的部分、待反转链表部分、后一段未反转部分
  • 将3个片段分离后,然后再连接起来
  • 细节注意:如果是从第一个开始反转链表,即前一段未反转的部分不存在,那么返回的结果就直接是反转链表片段的新节点,否则就是head

代码

class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null) {
return null;
} // cur用于记录当前节点的指向,刚开始就是指向head
ListNode cur = head;
// prev用于记录 前一段未反转的部分 的最后一个节点,默认初始指向null
ListNode prev = null;
// 反转链表后的头结点
ListNode tail = null;
// 用于记录表反转之后的最后一个节点
ListNode reverseTail = null; // 先获取prev,遍历结束后cur指向的是 待反转链表部分 的起使位置
for (int i = 1; i < m; i++) {
prev = cur;
cur = cur.next;
} // 待反转链表部分 的起使位置也就是链表反转之后的最后一个节点,我们先记录下来,为了最后和 后一段未反转部分 连接起来
reverseTail = cur; // 开始反转链表,遍历次数要是n-m+1,这样才能反转全,那么此时cur指向的就是 后一段未反转部分 的起始位置
for (int i = 0; i < n-m+1; i++) {
ListNode next = cur.next;
cur.next = tail;
tail = cur;
cur = next;
} // 现在将 待反转链表部分 的尾节点与 后一段未反转部分 的起始节点连接起来
reverseTail.next = cur; // 判断 前一段未反转的部分 的最后一个节点是否为空,如果为空的话,说明反转的是该链表前n个节点,直接返回 反转链后的头结点
if (prev == null) {
return tail;
} else {
// 否则的话,将 前一段未反转的部分 的最后一个节点与 待反转链表部分 的头节点连接起来,然后返回head
prev.next = tail;
return head;
}
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

思路2(递归)

  • 我们可以递归实现反转链表
  • 然后难度再加深一点,实现反转前 n 个链表
  • 但是题目需求是还有前 m-1 个链表节点不需要反转,所以我们通过递归把前 m-1 个个省略跳过即可(递归时候m和n都要同时减1,这样才能保证反转的部分保持不变),当 m 减少为1时,反转前n个即可
  • 在 reverseN 中,我们需要一个tail来记录后一部分不反转链表的第一个节点,也是反转链表最后一个节点指向的地方:head.next = tail;

代码

class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
// m为1代表就是直接反转前n个节点
if (m == 1) {
return reverseN(head, n);
} head.next = reverseBetween(head.next, m-1, n-1);
return head;
} /**
* 用于记录反转链表部分的尾结点指向
*/
ListNode tail = null; /**
* 反转链表的前n个节点
*/
public ListNode reverseN(ListNode head, int n) {
if (n == 1) {
tail = head.next;
return head;
} ListNode p = reverseN(head.next, n-1);
head.next.next = head;
head.next = tail;
return p;
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\)

力扣 - 92. 反转链表II的更多相关文章

  1. LeetCode 92. 反转链表 II(Reverse Linked List II)

    92. 反转链表 II 92. Reverse Linked List II 题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. LeetC ...

  2. Java实现 LeetCode 92 反转链表 II

    92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...

  3. 92.反转链表II

    题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...

  4. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  5. 92. 反转链表 II

    反转从位置 m 到 n 的链表.请使用一趟扫描完成反转.   说明: 1 ≤ m ≤ n ≤ 链表长度.   示例: 输入: 1->2->3->4->5->NULL, m ...

  6. 刷题-力扣-541. 反转字符串 II

    541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...

  7. LeetCode 92 ——反转链表 II

    1. 题目 2. 解答 我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可. 从前往后依次遍历 m ...

  8. LeetCode 92. 反转链表 II(Reverse Linked List II)

    题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, ...

  9. [LeetCode题解]92. 反转链表 II | 一次遍历 + 反转

    解题思路 将链表分为三部分:[0, m).[m, n].(n, L],其中 L 为链表长度. 第一步:使用虚拟头节点 dummy,用于将 head 也能参与操作: 第二步:找到第 m-1 节点(fir ...

随机推荐

  1. js & replaceAll & non-global RegExp bug

    js & replaceAll https://caniuse.com/#search=replaceAll https://developer.mozilla.org/en-US/docs/ ...

  2. flutter & plugins

    flutter & plugins https://pub.dev/ https://juejin.im/post/5c206b4ff265da61327f52f4

  3. Learn-JavaScript-with-MDN 系列文章: 01. var & let & const 对比

    Learn-JavaScript-with-MDN 系列文章: 01. var & let & const 对比 var & let & const 区别 https: ...

  4. 「NGK每日快讯」2021.1.25日NGK公链第83期官方快讯!

  5. Word带数学公式发布博客

    Word公式编辑器无法直接上传博客,一个一个的转换LaTeX还要加$,十分麻烦. 下面是我昨天摸索出来的办法.作为博客新人,这个问题困扰我一晚上,能解决我也是非常高兴的. 如果各位前辈有好方法的话,请 ...

  6. Java SE7虚拟机指令操作码助记符

    本文转载自Java SE7 虚拟机指令操作码助记符 导语 在Class文件中,Java方法里的方法体,也就是代表着一个Java源码程序中程序的部分存储在方法表集合的Code属性中.存储在Code属性中 ...

  7. Excel小技巧之VLOOKUP()使用简单说明

    前两天人事的小姐姐需要处理一个表格,需要在一张新表中的匹配旧表的数据,由于数据量较大不知如何处理. 我告诉她使用VLOOKUP()函数,然后她不知道怎么使用.其实我也不大用,因为数据库用的多很少使用表 ...

  8. SpringBoot自定义注解

    1.注解的概念 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影响. 2.注解的使用范围 1)为编译器提供信息:注解能被编译 ...

  9. CentOS7安装Maven3.6.3及Git2.8.3

    安装Maven3.6.3 点击进入官网 1:下载 wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-m ...

  10. kubernetes生产实践之mysql

    简介 kubedb mysql 生命周期及特性 Supported MySQL Features Features Availability Clustering ✓ Persistent Volum ...