class Solution { //反转函数 void reverseMy(ListNode* head) { ListNode* pre = head; ListNode* p = nullptr; while(pre) { ListNode *next = pre->next; pre ->next = p; p = pre; pre = next; } } public: ListNode* reverseBetween(ListNode* head, int m, int n) { // write code here if(head == nullptr) return nullptr; ListNode *pre = new ListNode(0); pre->next = head; ListNode *cur = pre; for(int i = 0; i < m - 1;i++) { cur = cur->next; } //这个结点要移动的到右边缘处 ListNode *rNode = cur; for(int i = 0; i < n - m + 1;i++) { rNode = rNode->next; } ListNode *lNode = cur->next; ListNode *next = rNode->next; //断开连接 cur->next = nullptr; rNode->next = nullptr; reverseMy(lNode); //因为反转了,左边缘编程有右边缘了 cur->next = rNode; lNode->next = next; return pre->next; } };