前言

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

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;

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

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

然后让 NodeM指向Mprenext域 指向的节点;

然后再重复上面的步骤;



这是 NodeMNodeN 相遇,反转完成。

代码

为了记录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. 用火山引擎DataTester,这家企业开始了“数据驱动增长”

    年末购物季已至,近些年来,预售抵扣.平台满减.品类专享券.大额补贴--动辄四五种计算方法叠加的大促活动,让不少消费者"懵"感十足.同一样商品,到底谁家卖的最便宜?比价平台应声发展而 ...

  2. Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级

    Jenkins Pipeline 流水线 - K8S kubectl 升级 使用代理节点 Remote SSH 远程执行命令进行升级 Remote SSH 方式 安装插件 SSH Pipeline S ...

  3. SpringBoot Kafka SSL接入点PLAIN机制收发消息

    applycation.yml spring: # https://developer.aliyun.com/article/784990 kafka: bootstrap-servers: XXXX ...

  4. python 正则表达式简单使用

    定义: 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个&quo ...

  5. C#开源免费的Blazor图表库

    前言 今天分享一款基于ApexCharts.js封装的.C#开源免费的Blazor图表库:Blazor-ApexCharts. 10款值得推荐的Blazor UI组件库 全面的ASP.NET Core ...

  6. Android 编译线程爆了, gradle 内存 OOM 解决之路

    本文首发我的微信公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 ...

  7. AliSSR 语音超分算法:让在线会议语音更明亮更自然

    超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会.手机入会又或是电话入会. 雪雅.曜辰|作者 众所周知,高采样率且高带宽的音频信号富含 ...

  8. 阿里云 AI 编辑部获 CCBN 创新奖,揭秘传媒行业解决方案背后的黑科技

    5 月 27 日,CCBN(第二十八届中国国际广播电视信息网络展览会)在北京隆重召开,在本次的 "CCBN 年度创新奖" 评选中,阿里云视频云凭借AI 编辑部的传媒行业专业解决方案 ...

  9. HTML5 postMessage 跨域跨窗口传递消息

    父页面代码: <!DOCTYPE html> <html> <head> <title>选择位置demo</title> <meta ...

  10. Windows下如何查看某个端口被占用,以及如何杀死某个进程

    查看所有端口 netstat -ano 如何查看某个特定端口的占用情况,比如 8080 netstat -ano|findstr "8080" 杀死一个进程 在查看某个端口被占用的 ...