/** 不同与直接将链表翻转 直接链表翻转头结点摘下来对剩下所有链表进行头插 指定区间翻转 找到翻转位置的前驱节点,第一个节点不动(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; } };