class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode* dum = new ListNode(-1); dum->next = head; ListNode* pre = dum; for(int i = 1; i < m; i++){ pre = pre->next; // 找到m的前一个结点 } ListNode* next = nullptr; ListNode* current = pre->next; // 此时current处于m结点位置处 for(int i = m; i < n; i++){ next = current->next; // next指向m的下一个结点 current->next = next->next; next->next = pre->next; pre->next = next; } return dum->next; } }; 1.首先是定义一个哑结点,将其值赋值为-1,并令哑节点的下一个结点为链表的头结点 2.然后通过将pre赋值给哑结点通过一个for循环将pre定位到m所在位置的前一个结点 3.定义当前结点current指向结点m的位置处,定义next结点为空 4.通过在(m, n)之间使用for循环,先令next结点指向当前结点的下一个结点,现在便是要将next结点插入到pre结点之后 随后,让当前结点的下一个结点指向next结点的下一个结点,这样就确定了下一个要进行的结点的位置(这样的作用是为下一步的移动插入做准备,在整个函数中的作用类似与大家经常使用的p=p->next) 再然后,next结点需要插入到此时的current结点之前以及pre结点之后, 因此有了pre->next = next->next(此步用于将pre的下一个结点设定为next的下一个结点) next = pre->next,这样就可以让pre的下一个结点设定为next结点了