#include <cstdio> class Solution { public: 时间复杂度On 空间复杂度O1 ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode* q = head; ListNode* p = head; for(int i = 1; i < m - 1; i ++) p = p->next; //令p指向m所指向的节点的前一个节点 for(int i = 1; i < n; i ++) q = q->next; //q指向n所指向的节点 if(m == 1) { //目的仍然是让p指向m所指的节点的前一个结点 p = new ListNode(-1); p->next = head; } int cnt = n - m; //循环cnt次 while(cnt --) { //依次把要翻转的区间内的节点往后放 ListNode* temp = p->next; p->next = temp->next; temp->next = q->next; q->next = temp; } if(m == 1) return p->next; //针对特殊情况 else return head; } };