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;//然后返回头结点
}
} };



京公网安备 11010502036488号