反转链表 II
问题描述
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回反转后的链表。
C++ 实现
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(ListNode *x) : val(x->val), next(x->next) {}* };*/class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {if (head == nullptr || left == right) {return head;}ListNode dummy(0); // 创建一个虚拟头节点,简化边界条件处理dummy.next = head;ListNode* prev = &dummy; // prev 指向 left 节点的前一个节点// 将 prev 移动到 left 节点的前一个位置for (int i = 0; i < left - 1; ++i) {prev = prev->next;}// 开始反转,curr 指向当前要反转的节点ListNode* curr = prev->next;for (int i = 0; i < right - left; ++i) {ListNode* temp = curr->next; // 临时保存当前节点的下一个节点curr->next = temp->next; // 将当前节点的下一个节点指向 temp 的下一个节点temp->next = prev->next; // 将 temp 的下一个节点指向 prev 的下一个节点prev->next = temp; // 将 prev 的下一个节点指向 temp}return dummy.next; // 返回虚拟头节点的下一个节点,即新的头节点}
};
代码解析
- 创建一个虚拟头节点
dummy
,其next
指针指向真实的头节点head
,这样可以避免处理head
为nullptr
的特殊情况。 - 使用
prev
指针遍历至left
节点的前一个节点。 - 使用
curr
指针指向left
节点,开始进行反转操作。 - 在
left
和right
之间进行节点的逐个反转,每次将curr
的next
节点摘出来插入到prev
和curr
之间,更新curr
的next
指针。 - 经过
right - left
次操作后,完成了从left
到right
的链表反转。 - 最后返回
dummy.next
,即新的头节点。