LeetCode-092-反转链表 II
反转链表 II
题目描述:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:利用栈
首先,如果head为null或者head只有一个节点,直接返回head。
否则, 声明一个新的头节点newHead,声明一个栈reverseNodes用来放left和right位置之间的节点(用于逆序),具体处理过程如下:
- 遍历head中的节点;
- 将left之前的节点一次放入新链表中;
- 将left和right之间的节点先放入栈reverseNodes中;
- 用rightNode记录right位置后节点的位置;
- 最后,将栈reverseNodes中的节点一次放入新的链表中,然后将rightNode放到新链表的最后。
最后,返回
newHead.next即为反转后的链表。
import com.kaesar.leetcode.ListNode;
import java.util.Stack;
public class LeetCode_092 {
public static ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null || head.next == null) {
return head;
}
// 声明一个新的头节点
ListNode newHead = new ListNode(-1);
ListNode leftNode = newHead, rightNode = head;
// 记录是否已经走过left和right位置
boolean findLeft = false, findRight = false;
// 将left和right之间的节点放入栈中
Stack<ListNode> reverseNodes = new Stack<>();
int count = 1;
while (head != null) {
if (findLeft && findRight) {
break;
}
if (findLeft) {
if (count == right) {
reverseNodes.add(head);
rightNode = head.next;
break;
} else {
reverseNodes.add(head);
head = head.next;
}
} else {
if (count == left) {
findLeft = true;
reverseNodes.add(head);
if (count == right) {
rightNode = head.next;
findRight = true;
break;
}
} else {
leftNode.next = head;
leftNode = leftNode.next;
}
head = head.next;
}
count++;
}
// 最后将栈中的节点逆序放入新的链表中
while (!reverseNodes.isEmpty()) {
leftNode.next = reverseNodes.pop();
leftNode = leftNode.next;
}
leftNode.next = rightNode;
return newHead.next;
}
public static void main(String[] args) {
ListNode head = new ListNode(3);
head.next = new ListNode(5);
ListNode result = reverseBetween(head, 1, 2);
while (result != null) {
System.out.print(result.val + " ");
result = result.next;
}
}
}
【每日寄语】 最初所拥有的只是梦想和毫无根据的自信而已,但是所有的一切都从这里开始。
LeetCode-092-反转链表 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 的链表.请使用一趟扫描完成反转. 说 ...
- 【python】Leetcode每日一题-反转链表 II
[python]Leetcode每日一题-反转链表 II [题目描述] 给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 ...
- leetcode 206. 反转链表 及 92. 反转链表 II
206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...
- LeetCode 206. 反转链表(Reverse Linked List) 16
206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...
- 92.反转链表II
题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...
- 【1】【leetcode-92】 反转链表 II
(没过,以为简单,结构链表指针搞得很复杂出错.是有捷径的,很典型题目要记住) 反转链表 II(medium) 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链 ...
随机推荐
- 再整理:Visual Studio Code(vscode)下的基于C++的OpenCV的最新搭建攻略解析
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/czlhxm/p/13848278.ht ...
- UCB DS100 讲义《数据科学的原理与技巧》校对活动正式启动 | ApacheCN
贡献指南:https://github.com/apachecn/ds100-textbook-zh/blob/master/CONTRIBUTING.md 整体进度:https://github.c ...
- Uwl.Admin.Core开源框架(三) 使用RabbitMQ
Uwl.Admin.Core中使用RabbitMQ消息队列: 本文负责讲解RabbitMQ的使用 Uwl.Admin.Core使用的技术有: *.Async和Await 异步编程 *.Reposito ...
- 后缀自动机 (SAM)
后缀自动机 定义 定义 SAM 为一个有限状态自动机,接受且仅接受 \(S\) 的一个后缀. 同时,SAM 是这样的自动机中最小的那个,其中状态数至多为 \(2n - 1\),转移数至多为 \(3n ...
- tcp 中 FLAGS字段,几个标识:SYN, FIN, ACK, PSH, RST, URG.
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段.它们的含义是: 1.SYN表示建立 ...
- mysql导出到文件错误(err 1290)
感谢大佬:https://blog.csdn.net/u014711094/article/details/78501771 select * into outfile 'g:/temp1.txt' ...
- Redis分布式锁实现原理
关于Redis分布式锁网上有很多优秀的博文,这篇文章仅作为我这段时间遇到的新问题的记录. 1.什么是分布式锁: 在单机部署的情况下,为了保证数据的一致性,不出现脏数据等,就需要使用synchroniz ...
- Redis主从复制、读写分离
一.Redis的主从复制是什么 主机数据更新后根据配置和策略,自行同步到备机的master/slave机制,Master以写为主,Slave以读为主. 二.Redis的主从复制能干什么 读写分离 容灾 ...
- endl与\n的用法区别
学习C++的时候,老师说换行有两种写法. 1 //方法一 2 3 std::cout<<"你好!\n李华"; 4 5 //方法二 6 7 std::cout<&l ...
- Linux-一次执行多个命令 ; && ||
一次执行多个命令,多个命令之间用:号隔开 cmd1;cmd2:cmd3 这样前后执行的时候没有依赖性,如果有下列要求呢 1. cmd1执行失败那就不要执行后面的命令 2. cmd1失败了才去指令后面的 ...