【1】【leetcode-92】 反转链表 II
(没过,以为简单,结构链表指针搞得很复杂出错。是有捷径的,很典型题目要记住)
反转链表 II(medium)
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL 链接:https://www.nowcoder.com/questionTerminal/b58434e200a648c589ca2063f1faf58c
来源:牛客网 1.头插法
对于reverse部分有点迷糊。网上看到的解释,也许更能帮助理解.https://yq.aliyun.com/articles/3867
不妨拿出四本书,摞成一摞(自上而下为 A B C D),要让这四本书的位置完全颠倒过来(即自上而下为 D C B A): 盯住书A,每次操作把A下面的那本书放到最上面 初始位置:自上而下为 A B C B 第一次操作后:自上而下为 B A C D 第二次操作后:自上而下为 C B A D 第三次操作后:自上而下为 D C B A
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode preStart = dummy;
ListNode start = head;
for (int i = 1; i < m; i ++ ) {
preStart = start;
start = start.next;
}
// reverse
for (int i = 0; i < n - m; i ++ ) {
ListNode temp = start.next;
start.next = temp.next;
temp.next = preStart.next;
preStart.next = temp;
}
return dummy.next;
}
}
我看了思路后:
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode mpre = dummy;
for (int i=1;i<m;i++) {
mpre = mpre.next;
}
ListNode p1 = mpre.next;
ListNode p2 = p1.next;
for (int i=0;i<n-m;i++) {
p1.next = p2.next; //p1不动
p2.next = mpre.next;
mpre.next = p2;
p2 = p1.next;
}
return dummy.next;
}
2.三个指针向后遍历(我这样做但是死链了)
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || m < 1 || m >= n ){
return head;
}
int i = 1;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode h1 = dummy;
while (i < m){
i++;
h1 = h1.next;
}
ListNode p1 = h1.next;
ListNode p2 = p1.next;
ListNode p3 = p2.next;
while (i < n) {
i++;
p2.next = p1;
p1 = p2;
p2 = p3;
if (p3 != null) {
p3 = p3.next;
}
}
h1.next.next = p2;
h1.next = p1;
return dummy.next;
}
}
再看反转链表 I很简单
反转链表 I
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
public ListNode reverseList(ListNode head) {
if (head == null){
return null;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
while(head.next != null) {
ListNode p = head.next;
head.next = p.next;
p.next = dummy.next;
dummy.next = p;
}
return dummy.next;
}
【1】【leetcode-92】 反转链表 II的更多相关文章
- LeetCode 92. 反转链表 II(Reverse Linked List II)
92. 反转链表 II 92. Reverse Linked List II 题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. LeetC ...
- Java实现 LeetCode 92 反转链表 II
92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...
- LeetCode 92 ——反转链表 II
1. 题目 2. 解答 我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可. 从前往后依次遍历 m ...
- LeetCode 92. 反转链表 II(Reverse Linked List II)
题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, ...
- [LeetCode] 92. 反转链表 II
题目链接 : https://leetcode-cn.com/problems/reverse-linked-list-ii/ 题目描述: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说 ...
- leetcode 206. 反转链表 及 92. 反转链表 II
206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...
- 92.反转链表II
题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...
- 力扣 - 92. 反转链表II
目录 题目 思路1(迭代) 代码 复杂度分析 思路2(递归) 代码 复杂度分析 题目 92. 反转链表 II 思路1(迭代) 将反转链表分成3个部分:前一段未反转的部分.待反转链表部分.后一段未反转部 ...
- Leetcode 92.反转链表
92.反转链表 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL ...
- [LeetCode题解]92. 反转链表 II | 一次遍历 + 反转
解题思路 将链表分为三部分:[0, m).[m, n].(n, L],其中 L 为链表长度. 第一步:使用虚拟头节点 dummy,用于将 head 也能参与操作: 第二步:找到第 m-1 节点(fir ...
随机推荐
- window文件过长无法删除的处理方式
解决方案: 如:aaa是要删除的文件夹,进入到要删除的文件夹下,新建一个test 1.以管理员身份打开CMD: 2 新建test空白目录: 3 执行命令,删除aaa文件夹:robocopy te ...
- zabbix 自定义 nginx 监控模板
打开zabbix首页→配置→模板→创建模板模板名称:Template App NGINXagent 需添加自定义监控项:UserParameter=nginx.status[*],/bin/bash ...
- CS Academy Gcd on a Circle(dp + 线段树)
题意 给你一个长为 \(n\) 的环,你可以把它断成任意 \(k\) 段 \((1 < k \le n)\) ,使得每一段的 \(\gcd\) 都 \(>1\) . 问总共有多少种方案,对 ...
- Hdoj 1856.More is better 题解
Problem Description Mr Wang wants some boys to help him with a project. Because the project is rathe ...
- HAOI(十二省联考)2019 qwq记
\(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...
- Linux下启动,停止,重启Nginx、Mysql、PHP
LINUX启动Nginx的命令: 一.查询是否启动 [root@jiang php-fpm.d]# ps -ef | grep nginx root 25225 1 0 19:26 ? 00:00:0 ...
- Pycharm For Linux
之前说过JetBrains系列的破解方式:https://www.cnblogs.com/dunitian/p/8478252.html 现在说下怎么固定到任务栏,速度版 详细讲解可以看之前说安装微信 ...
- Ubuntu18.04搜狗输入法最新版本2.2.0.0108经常乱码的解决方案
图示 解决 旧版 可以安装旧版(我只在新版sogoupinyin_2.2.0.0108_amd64才遇到这个问题) 旧版安装指南:http://www.cnblogs.com/dunitian/p/6 ...
- (一)flask-sqlalchemy的安装和配置
在使用flask-sqlalchemy之前要先了解ORM模型,什么叫做ORM模型 一.什么是ORM ORM 全拼Object-Relation Mapping. 称为对象-关系映射 主要实现模型对象到 ...
- OpenLayers学习笔记(二)— QML与HTML通信之画图
作者: 狐狸家的鱼 Github: 八至 本文链接:QML与 HTML通信—实现QML中点击功能按钮在地图上画图 一.HTML-map var drarGraphic; var drawType;fu ...