反转链表 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,即新的头节点。