题意:
原题链接
思路:
先找到 L , R L,R L,R,由于我们是翻转区间 [ L , R ] [L,R] [L,R],因此需要知道L
的上一个结点
所以遍历到L
的上一个结点即可,之后再遍历到R
,由于翻转后需要将 [ L , R ] [L,R] [L,R]与原链表拼接,所以记录Rnext
为原R->next
。
之后反转链表
进行拼接即可。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* prev, ListNode* head, ListNode* tail) {
if(head == tail) return head;
ListNode *pre = prev, *cur = head;
while(cur != tail) {
ListNode *nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode *dummy = new ListNode(-1, head);
ListNode *L = dummy, *R = dummy;
for(int i = 0; i < left - 1; ++i) L = L->next;
for(int i = 0; i < right; ++i) R = R->next;
ListNode *Rnext = R->next;
ListNode *next_tail = L->next;
ListNode *next_head = reverseList(L, L->next, Rnext);
L->next = next_head;
next_tail->next = Rnext;
return dummy->next;
}
};