一、运行结果
二、题目
三、思路
要实现指定区间的反转,首先要找到要找到指定区间的首节点(p指针指向)及其前驱节点(pre指针指向),然后以pre指针指向的节点为头,对指定区间实行头插法,p指针始终指向原指定区间的首节点,不断将p的下一个节点插入到pre后,实现反转。
四、代码
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* dummy = new ListNode(-1);
dummy->next = head; //新头结点
ListNode* pre = dummy;
ListNode* p = head;
for(int i=1; i<m; i++){
p = p->next; //退出循环时p指向指定区间的第一个结点
pre = pre->next;
}
int count = m;
while(p->next && count < n){ //头插法实现反转
ListNode* tmp = p->next;
p->next = p->next->next;
tmp->next = pre->next;
pre->next = tmp;
count++;
}
return dummy->next;
}
};