要注意几个指针的使用,要设置一个虚头指针,用来标记但left=1的时候pre的位置;
初始pre等于虚头指针。然后找到要反转的链表,进行反转,这边我单独写一个函数,使思路看起来更清晰。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reverse(struct ListNode* head){
struct ListNode* pre=NULL;
struct ListNode* cur=head;
while(cur){
struct ListNode* next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode* m=malloc(sizeof(struct ListNode));
m->val=-1;
m->next=head;
struct ListNode* pre=m;
int i=1;
for(i=1;i<=left-1;i++){
pre=pre->next;
}
struct ListNode* p1=pre->next;
struct ListNode* p2=m;
for(i=1;i<=right;i++){
p2=p2->next;
}
struct ListNode* cur=p2->next;
p2->next=NULL;
pre->next=NULL;
reverse(p1);
p1->next=cur;
pre->next=p2;
return m->next;
}