反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(nullptr) {}
};
class Solution
{
public:
ListNode* reverseBetween(ListNode *head, int m, int n)
{
if(n == 1 || !head) return head;
ListNode *prev = nullptr;
ListNode *curr = head;
while(m > 1)
{
prev = curr;
curr = curr->next;
m--;
n--;
}
ListNode *before = prev;
ListNode *after = curr;
while(n > 0)
{
ListNode *nextptr = curr->next;
curr->next = prev;
prev = curr;
curr = nextptr;
n--;
}
if(before) before->next = prev;
else head = prev;
after->next = curr;
return head;
}
};