92. 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->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
链接: http://leetcode.com/problems/reverse-linked-list-ii/
题解:
把翻转部分隔离出来,记录这部分之前的节点和之后的节点。然后翻转这部分,再和之前记录的两个节点连接起来就可以了。
Time Complexity - O(n), Space Complexity - O(1)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || head.next == null || m == n)
return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode preHeadToReverse = dummy, tailToReverse = dummy;
int count = 0; while(count < n) {
if(tailToReverse == null)
return dummy.next;
if(count < m - 1)
preHeadToReverse = preHeadToReverse.next;
tailToReverse = tailToReverse.next;
count++;
} ListNode headToReverse = preHeadToReverse.next, postTailToReverse = tailToReverse.next;
tailToReverse.next = null;
preHeadToReverse.next = reverse(headToReverse);
headToReverse.next = postTailToReverse;
return dummy.next;
} private ListNode reverse(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode dummy = new ListNode(-1); while(head != null) {
ListNode tmp = head.next;
head.next = dummy.next;
dummy.next = head;
head = tmp;
} return dummy.next;
}
}
这道题目应该和其他几道联合起来做,比如按照先后顺序完成以下几道题目
1) Reverse Linked List
2) Reverse Linked List II
3) Swap Node in Pairs
4) Swap Node in K-Gruo
二刷:
我们需要记录四个变量, pre, headToReverse,tailToReverse, postTail,然后当遍历时节点在headToReverse以及tailToReverse的时候我们反转。下面我写得比较麻烦,单独把reverse写成了一个函数,而切要先找到结尾点才能reverse,这样就多遍历了一遍反转区域,还需要好好改写。
Java:
Time Complexity - O(n), Space Complexity - O(1)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || head.next == null || m == n) {
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode preHeadToReverse = dummy, tailToReverse = dummy;
while (m > 1 || n > 0) {
if (m > 1) {
preHeadToReverse = preHeadToReverse.next;
m--;
}
if (n > 0) {
tailToReverse = tailToReverse.next;
n--;
}
}
ListNode headToReverse = preHeadToReverse.next, postTailToReverse = tailToReverse.next;
tailToReverse.next = null;
preHeadToReverse.next = reverse(headToReverse);
headToReverse.next = postTailToReverse;
return dummy.next;
} private ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(-1);
ListNode tmp = new ListNode (-1);
while (head != null) {
tmp = head.next;
head.next = dummy.next;
dummy.next = head;
head = tmp;
}
return dummy.next;
}
}
下面直接one pass。 我们先设置fakeHead dummy, 让preHead = dummy, 找的过程中当m > 1的时候 preHeadToReverse = preHeadToReverse .next, 然后找到headToReverse = preHeadToReverse.next,也设置一个标记tail = headToReverse,最后用来添加连接反转前节点n的后一个节点postTail。
接下来我们先设置preHeadToReverse.next = null,在(n > 0以及headToReverse != null)的情况下, 我们利用reverse linkedlist的方法遍历这部分反转区域。遍历完毕以后的headToReverse就等于反转前节点n的下一个节点postTail, 这时候我们只需要将两部分连接起来,做一个 tail.next = headToReverse就可以了。还能再简化。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || head.next == null || m == n) {
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode preHeadToReverse = dummy;
while (m > 1) {
preHeadToReverse = preHeadToReverse.next;
m--;
n--;
}
ListNode headToReverse = preHeadToReverse.next;
ListNode tail = headToReverse, node = headToReverse;
preHeadToReverse.next = null;
while (n > 0 && headToReverse != null) {
node = headToReverse.next;
headToReverse.next = preHeadToReverse.next;
preHeadToReverse.next = headToReverse;
headToReverse = node;
n--;
}
tail.next = headToReverse;
return dummy.next;
}
}
三刷:
方法和二刷一样。
- 先找到m的前一个节点pre,这里要注意是在m > 1的条件下进行遍历
- 设置head = pre.next,用来进行遍历, 设置tail = head,因为翻转完毕以后这个head节点应该处于最后,所以我们设置这个tail用来连接n后面的节点们
- 设置tmp = head,也可以直接设置tmp为null,用来保存时head下一位置的节点
- 设置pre.next = null
- 在n > 0的情况下进行翻转,每次n--
- 最后连接tail和tmp,然后返回结果
Java:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy; while (m > 1) {
pre = pre.next;
m--;
n--;
} head = pre.next;
ListNode tail = head;
ListNode tmp = head;
pre.next = null; while (n > 0) {
tmp = head.next;
head.next = pre.next;
pre.next = head;
head = tmp;
n--;
} tail.next = tmp;
return dummy.next;
}
}
Reference:
https://leetcode.com/discuss/10794/share-my-java-code
https://leetcode.com/discuss/25580/simple-java-solution-with-clear-explanation
https://leetcode.com/discuss/35440/240ms-java-solution
https://leetcode.com/discuss/72660/short-java-solution-for-reverse-linked-list-ii
92. Reverse Linked List II的更多相关文章
- 92. Reverse Linked List II【Medium】
92. Reverse Linked List II[Medium] Reverse a linked list from position m to n. Do it in-place and in ...
- [LeetCode] 92. 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 ...
- [LeetCode] 92. Reverse Linked List II 反向链表II
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- 【LeetCode】92. Reverse Linked List II 解题报告(Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 题目地址:https://leet ...
- leetcode 92 Reverse Linked List II ----- java
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- LeetCode OJ 92. 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-> ...
- 【leetcode】92. 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-> ...
- 【一天一道LeetCode】#92. Reverse Linked List II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Reverse ...
- LeetCode 92. Reverse Linked List II倒置链表2 C++
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
随机推荐
- 公交CPU卡原理
现在的公交卡已经开始逐步的采用IC卡(CPU卡?什么东东?),而且在国家交通部的推动下,开始了全国范围内的互联互通.以后,手里只用拿着一张卡,就可以走遍全国,而且如果支持在线充值的话,基本上就不用在车 ...
- C/C++中浮点数格式学习——以IEEE75432位单精度为例
这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...
- STL merge的实现细节
//std::merge的两个版本 template<class InputIt1, class InputIt2, class OutputIt> //First version Out ...
- laravel 框架 开源的cms推荐
laravel 框架写的开源的cms系统 TypiCMS系统 多语言和模块化的CMS Laravel 5.2框架 下载地址:https://github.com/TypiCMS/Base Bootst ...
- Linux系统下ssh的相关配置详细解析
Linux系统下ssh的相关配置进行了详细的分析介绍. ssh是大家常用的登录linux服务器的方式,但是为了安全考虑,有时候我们需要针对ssh做一些特殊处理,本文记录笔者曾经做过的一些修改,供大家参 ...
- 如何实现phpcms v9_4X版本tag的伪静态?
这两个月来写的文章越来越少了,不是懒,因为太忙了--为客户赶做网站.因为客户指定要使用phpcms v9,还要求使用phpcms v9_42版本实现tag伪静态,在接手的时候phpcms v9_42是 ...
- Centos6.4 安装NLTK
NLTK 安装链接 http://www.nltk.org/install.html 不知道什么原因打不开pypi 的网站 http://pypi.python.org/pypi/setuptool ...
- linux eval命令
eval 功能说明:重新运算求出参数的内容.语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行.参 数:参数不限数目,彼此之间用分号分开. 1.eval命令将 ...
- [mac git 服务器端]
http://blog.csdn-net/kesalin/article/details/6943770 XCode 4 默认支持 Git 作为代码仓库,当我们新建一个仓库的时候,可以勾选创建默认仓库 ...
- fineui框架
http://fineui.com/demo/#/demo/layout/fit.aspx 虽然比较丑陋,但功能实用 此框架比较简单, 框架的作用你懂的,重点是要有帮助文档, 进阶型的容易上手的帮助文 ...