描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/
求解
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (!head || m == n) {
return head;
}
ListNode *dummyHead = new ListNode(); // 虚拟头结点
dummyHead->next = head;
// 移动得到m位置
auto left = dummyHead;
auto pm = head;
while (m > 1) {
left = left->next;
pm = pm->next;
--m;
}
// 移动得到n位置
auto pn = head;
auto right = pn->next;
while (n > 1) {
pn = pn->next;
right = right->next;
--n;
}
// 将m-n翻转
pn->next = nullptr;
auto rlist = reverseList(pm);
// 前后处理
left->next->next = right;
left->next = rlist;
auto res = dummyHead->next;
delete dummyHead;
return res;
}
private:
// 翻转链表
ListNode *reverseList(ListNode *head) {
ListNode *pre = nullptr;
ListNode *cur = head;
while (cur) {
auto next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
};