Skip to content

Reverse Linked List II⚓︎

Link

Description⚓︎

Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.

Example 1:

Example 1

  • Input: head = [1,2,3,4,5], left = 2, right = 4
  • Output: [1,4,3,2,5]

Example 2:

  • Input: head = [5], left = 1, right = 1
  • Output: [5]

Constraints:

  • The number of nodes in the list is n.
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

Solution⚓︎

Iterative Solution⚓︎

See reference (Chinese).

Explain 0

Explain 1

/**
 * 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* reverseBetween(ListNode* head, int left, int right) {
        ListNode* dummy = new ListNode(0, head);

        ListNode* before = dummy;
        for (int i = 0; i < left - 1; i++) {
            before = before->next;
        }

        ListNode* pre = nullptr;
        ListNode* curr = before->next;
        for (int i = 0; i < right - left + 1; i++) {
            ListNode* originalNext = curr->next;
            curr->next = pre;
            pre = curr;
            curr = originalNext;
        }

        before->next->next = curr;
        before->next = pre;

        return dummy->next;
    }
};
  • Time complexity: \(O(n)\);
  • Space complexity: \(O(1)\).

Recursive Solution⚓︎

See reference (Chinese).

/**
 * 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 {
private:
    ListNode* reverseN(ListNode* head, int n) {
        if (n == 1) {
            return head;
        }

        ListNode* last = reverseN(head->next, n - 1);
        ListNode* successor = head->next->next;
        head->next->next = head;
        head->next = successor;
        return last;
    }

public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if (left == 1) {
            return reverseN(head, right);
        }

        head->next = reverseBetween(head->next, left - 1, right - 1);
        return head;
    }
};