首先创建一个哑结点,方便后续操作。
找到指定区间的第一个的前一个结点。
进行n-m+1次反转链表的操作就行了。
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (!head || m == n)return head;
ListNode dummy(0);
dummy.next = head;
ListNode *pre = &dummy;
//找到反转部分的前一个(后续需要重新连接,需要知道该结点位置)
for (int i = 1; i < m; ++i)pre = pre->next;
ListNode *curr = pre->next;
ListNode *start = curr;//记下反转部分的第一个,反转之后需要指向第一个非反转结点
ListNode *prev = nullptr;
ListNode *tmp;
int k = n - m + 1;
for (int i = 0; i < k; ++i) {
tmp = curr->next;
curr->next = prev;
prev = curr;
curr = tmp;
}
//操作结束后,prev是反转后的开头,curr是反转部分的下一个结点
pre->next = prev;
start->next = curr;
return dummy.next;
}
};
};

京公网安备 11010502036488号