题目

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. vue & arrow function error

    vue & arrow function error <template> <div class="home"> <img alt=" ...

  2. how to share UI components

    how to share UI components The shared component cloud · Bit https://bit.dev/ A better way to build w ...

  3. HTML5 in depth

    HTML5 in depth Content Models Web Storage web storage 存储用户信息, 替代 cookies LocalStorage SessionStorage ...

  4. yarn & uninstall global & yarn global remove

    yarn uninstall global yarn global remove https://yarnpkg.com/lang/en/docs/cli/remove/ https://yarnpk ...

  5. xcode upgrade & git bug

    xcode upgrade & git bug ➜ op-static git checkout feature/select-seat-system Agreeing to the Xcod ...

  6. perl 打印简单的help文档

    更多 PrintHelp.pm #!/usr/bin/perl package PrintHelp; require Exporter; use v5.26; use strict; use utf8 ...

  7. NGK全球行伦敦站,SPC推动全球数字金融创新

    近日,NGK全球巡回路演在英国的首都伦敦盛大落幕,此次路演有幸邀请到了西欧区块链业界弗洛伊德大咖,NGK方面代表鲍利斯以及英国及其组周边国家社群意见代表马丁内斯等人,总计参与人数达到了数十人. 路演一 ...

  8. Egg.js 是什么?

    Egg.js 是什么? 阿里巴巴出 Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本. 注:Egg.js 缩写为 Egg 设 ...

  9. redis源码之SDS

    1:SDS介绍 我们在redis中执行命令 set key name 的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的 ...

  10. 不同浏览器CSS样式不兼容问题

    一句话,我想的太复杂了.向朋友请教才了解到,其实只要加个判断即可,首先获取到浏览器的基本信息,像什么版本啊,名称啊.默认语言啊等等,然后根据不同浏览器默认加载不同CSS样式即可,获取浏览器版本的连接如 ...