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结点了