前言

反转链表可以先看我这篇文章:

Leetcode 206题 反转链表(Reverse Linked List)Java语言求解

题目链接

https://leetcode-cn.com/problems/reverse-linked-list-ii/

题目描述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:

1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4

输出: 1->4->3->2->5->NULL

分析

给定初始链表为 1->2->3->4->5->NULL,如图

我们需要找到第 m 个节点和第 n 个节点,分别记为 MNode 和 ** NNode** 同时也要记录第 m 个节点的前驱节点,记为 Mpre;

我们接下来要做的是,先把Mpre的 next域 指向NodeM节点的后一个节点;

再把 NodeM所在节点移动到 NodeN 所在节点之后,使得 NodeN的 next域指向 NodeM所在节点,NodeM所在节点 next域 指向 NodeN的next域所指节点;

然后让 NodeM指向Mpre的 next域 指向的节点;

然后再重复上面的步骤;



这是 NodeM 和 NodeN 相遇,反转完成。

代码

为了记录NodeM的前驱节点,我们新建一个虚拟节点,使得该节点的next域指向head;

ListNode pre = new ListNode(0);

我们并不移动pre这个节点,因为在移动的过程中会改变pre存储的地址,我们再新建一个Mpre;

ListNode Mpre = pre;

新建变量和找NodeM节点和NodeN节点的代码为:

ListNode pre = new ListNode(0);
pre.next = head;
ListNode Mpre = pre;
ListNode NodeM = head;
ListNode NodeN = head;
int mNum = 1;
int nNum = 1;
while(mNum < m && NodeM != null){
Mpre = NodeM;
NodeM = NodeM.next;
mNum++;
} while(nNum < n && NodeN != null){
NodeN = NodeN.next;
nNum++;
}

反转的代码为:

while(NodeM != NodeN){
Mpre.next = NodeM.next;
NodeM.next = NodeN.next;
NodeN.next = NodeM;
NodeM = Mpre.next;
}

因为我们新建了一个虚拟节点,我们返回如下

return pre.next;

完整代码如下:

public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n){
if(m==n || head == null||head.next == null){
return head;
} ListNode pre = new ListNode(0);
pre.next = head;
ListNode Mpre = pre;
ListNode NodeM = head;
ListNode NodeN = head;
int mNum = 1;
int nNum = 1;
while(mNum < m && NodeM != null){
Mpre = NodeM;
NodeM = NodeM.next;
mNum++;
} while(nNum < n && NodeN != null){
NodeN = NodeN.next;
nNum++;
} while(NodeM != NodeN){
Mpre.next = NodeM.next;
NodeM.next = NodeN.next;
NodeN.next = NodeM;
NodeM = Mpre.next;
}
return pre.next;
}
}

欢迎关注

欢迎大家的关注

扫描下方的二维码关注我的微信公众号:code随笔

Leetcode 92题反转链表 II(Reverse Linked List II) Java语言求解的更多相关文章

  1. Leetcode 206题 反转链表(Reverse Linked List)Java语言求解

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

  2. Leetcode 20题 有效的括号(Valid Parentheses) Java语言求解

    题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空 ...

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

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

  4. LeetCode算法题-Delete Node in a Linked List(Java实现)

    这是悦乐书的第197次更新,第204篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第60题(顺位题号是235).编写一个函数来删除单链表中的节点(尾部除外),只允许访问该 ...

  5. [Swift]LeetCode92. 反转链表 II | Reverse Linked List II

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  6. LeetCode - 92、反转链表 II

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

  7. 【链表】 Reverse Linked List II

    题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1- ...

  8. lc面试准备:Reverse Linked List II

    1 题目 Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1 ...

  9. LeetCode之“链表”:Reverse Linked List && Reverse Linked List II

    1. Reverse Linked List 题目链接 题目要求: Reverse a singly linked list. Hint: A linked list can be reversed ...

  10. 【python】Leetcode每日一题-反转链表 II

    [python]Leetcode每日一题-反转链表 II [题目描述] 给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 ...

随机推荐

  1. Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令

    Jenkins Pipeline 流水线 - 上传文件 Publish over SSH 执行命令 Jenkins插件安装 Publish over SSH 系统配置 生成代码 sshPublishe ...

  2. 盛科交换机和ovs交换机建立VxLAN隧道

    环境信息 盛科交换机信息: R3# show version CentecOS Software, E580, Version 5.3.6 Copyright (C) 2004-2017 Centec ...

  3. maven 强制使用本地仓库

    pom 文件添加如下内容: <repositories> <repository> <id>alimaven</id> <name>aliy ...

  4. Windows环境下,解决无法使用ping命令

    众所周知,ping命令是个非常实用的网络命令:有时,我们会发现在电脑中无法使用ping命令,一般来说,是由于电脑的环境变量出了问题,本文将介绍如何解决这个问题. 1.一般出现ping命令无法使用的情况 ...

  5. vivo悟空活动中台-打造 Nodejs 版本的MyBatis

    经典的架构设计可以跨越时间和语言,得以传承. -- 题记 一.背景 悟空活动中台技术文章系列又和大家见面了,天气渐冷,注意保暖. 在往期的系列技术文章中我们主要集中分享了前端技术的方方面面,如微组件的 ...

  6. 五、mycat水平分库

    系列导航 一.Mycat实战---为什么要用mycat 二.Mycat安装 三.mycat实验数据 四.mycat垂直分库 五.mycat水平分库 六.mycat全局自增 七.mycat-ER分片 一 ...

  7. node-sass安装失败,安装后无法使用 gyp verb check python checking for Python executable "python2" in the PATH

    这个问题搞了一会想起开始安装node-sass时的一句被我忽略的提示:执行 npm rebuild node-sass 这行后就可以了. 再说说 node-sass 的安装问题,现在使用 yarn i ...

  8. C#设计模式04——工厂方法的写法

    1. What是C#工厂方法?C#工厂方法是一种设计模式,它通过创建具有相同基类的对象来实现代码的重用和灵活性. 2. Why使用C#工厂方法?使用C#工厂方法有以下好处:- 降低了代码的耦合性,让代 ...

  9. RL 基础 | 讲的很好的 TRPO 博客

    特意存档: 知乎 | 如何看懂TRPO里所有的数学推导细节? 感觉把 idea 讲的很清楚(虽然没有特别仔细看-

  10. 域名解析类型及dig,nslookup进行Dns解析过程查看

    本文为博主原创,未经允许不得转载: 通常我们在windows系统下查看域名是不是可以正常访问,是通过cmd命令打开dos窗口,使用ping 命令来查看域名是不是可以正常访问,使用 ping 命令正常访 ...