/*
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
*/
/*
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *pre=NULL;
ListNode *cur=head;
while(m>1)
{
//先让pre指向m位置的前一个元素,cur指向m位置的元素
pre=cur;
cur=cur->next;
m--;
n--;
}
//用p1来记录pre的值,用p2来记录cur的值,因为之后p1和p2要指向别的位置
ListNode *p1=pre;
ListNode *p2=cur;
while(n>0)
{
//开始翻转
ListNode *next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
n--;
}
//翻转完成后让p1指向pre的位置,让p2指向cur的位置,使得串在一起
if(p1!=NULL){
p1->next=pre;
}
else
{
head=pre;
}
p2->next=cur;
return head;
}
};
来源:CSDN
作者:Ther Meng
链接:https://blog.csdn.net/weixin_42226134/article/details/104573543