
目录
- 1.题目
- 2.答案
- 3.提交结果截图
链接: 反转链表 II
1.题目
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
- 链表中节点数目为
n 1 <= n <= 500-500 <= Node.val <= 5001 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?
2.答案
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public static ListNode reverseBetween(ListNode head, int left, int right) {
if (left == right) {
return head;
}
ListNode node = head;
int index = 1;
ListNode beforeLeftNode = null;
ListNode leftNode = null;
ListNode rightNode = null;
ListNode afterRightNode = null;
ListNode beforeNode = null;
while (node != null) {
if (index == left) {
beforeLeftNode = beforeNode;
leftNode = node;
beforeNode = node;
node = node.next;
} else if (index > left && index < right) {
ListNode afterNode = node.next;
node.next = beforeNode;
beforeNode = node;
node = afterNode;
} else if (index == right) {
afterRightNode = node.next;
rightNode = node;
rightNode.next = beforeNode;
break;
} else {
beforeNode = node;
node = node.next;
}
index++;
}
if (beforeLeftNode != null) {
beforeLeftNode.next = rightNode;
} else {
head = rightNode;
}
assert leftNode != null;
leftNode.next = afterRightNode;
return head;
}
}
3.提交结果截图

整理完毕,完结撒花~ 🌻










![克隆图[中等]](https://img-blog.csdnimg.cn/direct/b88623227d314c23bf96de03d697817b.png)








