就用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;
}
};