就用1,2,3,4,5 画个图就行。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m > n || m < 0)return nullptr;
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *p = dummy;
int count = 1;
while (count<m)
{
count++;
p = p->next;
}
reverse(p, n - m + 1);//以p开始翻转n-m+1
return dummy->next;
}
ListNode *reverse(ListNode *preStart, int step)
{
ListNode *last = preStart->next;//preStart是第m个点的前一个,此时last指向第m个点
if (last == nullptr)return preStart;//这里要注意第m个点不存在
ListNode * M_head = last;
ListNode * cur = last->next;
ListNode *tmp = nullptr;
while (step>1 && cur != nullptr)
{
tmp = cur->next;
cur->next = last;
last = cur;
cur = tmp;
step--;
}
M_head->next = cur;//第m个点
preStart->next = last;
return M_head;
}
};