【面试系列】反转链表II

题意:
原题链接

思路:
先找到 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;
    }
};

Guess you like

Origin blog.csdn.net/weixin_43900869/article/details/119785172