1.找到开始逆置的结点,head向前移动m-1,记录该结点的前驱、该结点
2.从head开始,逆置change_len = n-m+1 个结点
3.将pre_head与new_head连接,modify_list_tail 与head连接
// 1 2 3 4 5
// 1 4 3 2 5
// | | |
//pre_head new_head modify_list_tail
//head 已经从2到了5
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int change_len = n - m + 1;
ListNode* pre_head = nullptr;
ListNode* res = head;//非特殊情况的话,最后就返回它
while(head && --m)//移动到要开始逆置的位置
{
pre_head = head;//指向要逆转的第一个结点的前驱
head = head->next;
}
ListNode* modify_list_tail = head;//逆转后的链表尾部结点就是现在这个位置
ListNode* new_head = nullptr;
while(head && change_len)//反转这部分链表
{
ListNode* next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--;
}
modify_list_tail->next = head;
//注意特殊情况如下:
if(pre_head)//如果不为空,说明不是特殊情况,m>1
pre_head->next = new_head;
else//说明是从m=1的位置开始逆置的,结果就是逆置后的头结点
res = new_head;
return res;
}
};