目录
- 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 <= 500
1 <= 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.提交结果截图
整理完毕,完结撒花~ 🌻