执行结果:
解题思路:
- 将l、r指针分别分配到区间开始位置与结束位置(注意边界问题);
- 用p、q指针在反转区间开始反转链表(注意首先将反转区间的第一个结点的next指向空);
- 将三短区间链接;
语言:C++
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
while(left==right||head->next==NULL){return head;}
ListNode *dummy=new ListNode(-1);
dummy->next=head;
ListNode *l=dummy;
ListNode *r=dummy;
ListNode *p=NULL;
ListNode *q=NULL;
ListNode *n=NULL;
left=left-1;
while(left){
l=l->next;
left--;
}
while(right+1){
r=r->next;
right--;
}
p=l->next;
q=p->next;
p->next=NULL;
n=p;
while(q!=r){
ListNode *s=q->next;
q->next=p;
p=q;
q=s;
}
l->next=p;
n->next=r;
return dummy->next;
}
};
细节提升
1.边界问题
自己写示例把边界问题测试一下,插入哨兵节点可以避免很多边界问题。
ListNode *dummy=new ListNode(-1);
dummy->next=head;
return dummy->next;
2.插入左右边界
left=left-1;
while(left){
l=l->next;
left--;
}
while(right+1){
r=r->next;
right--;
}



