class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) { if(m==n) return head; int i=1; ListNode *phead=head; ListNode *head_m=head;//第m个节点的前一个节点 ListNode *after=nullptr;//第n个节点的后一个节点 ListNode *first=nullptr;//第m个节点的前一个节点 while(phead) { if(i+1==m) { first=phead;////第m个节点的前一个节点 head_m=phead->next;//第m个节点 } if(i==n) { after=phead->next;//第n个节点的后一个节点 phead->next=nullptr;//断链 break; } phead=phead->next; i++; } ListNode *pre=nullptr; ListNode *phead_m=head_m; while(phead_m)//这里实现翻转,pre最后就是第n个节点 { ListNode *cur=phead_m->next; phead_m->next=pre; pre=phead_m; phead_m=cur; } head_m->next=after;//把上面断链的节点接上 if(m==1) return pre;//如果m=1,说明直接是从链表头开始翻转的,直接返回 else { first->next=pre;//否则就需要把前面的接上 return head;//然后返回头结点 } }
};