给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
要解出这道题,我们需要先找到要操作的第left个节点p1和它的下一个节点p2,并记录下第left-1个节点p0备用。然后利用整体反转链表的方法在循环中不断改变节点指向,直到p1遍历到第right-1个节点。
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode dummy(0,head);
ListNode* p0=&dummy;
for(int i=0;i<left-1;i++)
{
p0=p0->next;
}
ListNode *p1=nullptr;
ListNode *p2=p0->next;
for(int i=0;i<right-left+1;i++)
{
ListNode *p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
p0->next->next=p2;
p0->next=p1;
return dummy.next;
}
*p0->next->next=p2;以及p0->next=p1;的原因:
由图可知,在进行完最后一次循环后,p1指向了第right-1个节点,p2指向了第right个节点。此时只是将要操作的部分链表内部反转了,要将它们在链表中整体反转过来,就要将我们最初记录下来的p0节点指向这个部分链表反转后的“头节点”,也就是p1。不过我们要先将这部分链表的“尾节点”p1->next接到第right个节点前。