/**
不同与直接将链表翻转
直接链表翻转头结点摘下来对剩下所有链表进行头插
指定区间翻转
找到翻转位置的前驱节点,第一个节点不动(head也是翻转的尾部节点)将后面的节点一个一个摘下来进行头插,摘下后保持不断链
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
//声明一个头结点
ListNode* h = new ListNode(-1);
h->next = head;
ListNode* pre = h;
// 找到反转位置的前驱节点 且 不变 用于头插
for(int i = 1; i < m; i++){
pre = pre->next;
}
head = pre->next; // head 相当于反转的尾节点、防止断链、寻找遍历节点
ListNode *r ; // 要操作的节点
for(int i =m;i < n;i++){
// 标记r,摘掉r,插入r
r = head->next;
head->next = r->next;
r->next = pre->next;
pre->next = r;
}
return h->next;
}
};