92. Reverse Linked List II
题目大意
Given the head of a singly linked list and two integers left
and right
where left <= right
, reverse the nodes of the list from position left
to position right
, and return the reversed list.
中文释义
给定一个单链表的头节点以及两个整数 left
和 right
(left <= right
),反转链表中从位置 left
到位置 right
的节点,并返回反转后的链表。
示例
Example 1:
Input: head = [1,2,3,4,5]
, left = 2
, right = 4
Output: [1,4,3,2,5]
Example 2:
Input: head = [5]
, left = 1
, right = 1
Output: [5]
限制条件
- 链表中节点的数量为 n。
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶问题
你能否只遍历一次完成此任务?
解题思路
方法
即在给定的单链表中反转从位置 left
到 right
的节点。方法使用的是迭代方式。
-
边界条件检查:
- 如果头节点
head
为空或left
和right
相等,则不需要反转,直接返回head
。
- 如果头节点
-
使用哨兵节点:
- 创建一个哨兵节点
dummy
并将其next
指向head
。 - 创建一个指针
prev
指向这个哨兵节点。
- 创建一个哨兵节点
-
定位到反转的起始位置:
- 通过循环移动
prev
指针,直到它位于反转部分的前一个节点。
- 通过循环移动
-
反转指定部分:
- 创建
start
指向反转部分的第一个节点,then
指向start
的下一个节点。 - 在一个循环中,不断将
then
节点移动到prev
节点之后,完成反转。 - 循环操作,直到完成指定部分的反转。
- 创建
-
返回结果:
- 返回哨兵节点
dummy
的next
,即反转后的链表头节点。
- 返回哨兵节点
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if (!head || left == right) return head;
ListNode dummy(0), *prev = &dummy;
dummy.next = head;
for (int i = 0; i < left - 1; ++i) prev = prev->next;
ListNode *const start = prev->next, *then = start->next;
for (int i = 0; i < right - left; ++i) {
start->next = then->next;
then->next = prev->next;
prev->next = then;
then = start->next;
}
return dummy.next;
}
};