Reverse a Sublist of a Linked List

medium linked list pointers

Problem

Given the head of a singly linked list and 1-indexed positions left and right, reverse the nodes from position left to position right in place. Use a dummy head so we can address the predecessor of left uniformly. Walk forward to the predecessor, then repeatedly take the node after cur and head-insert it just after the predecessor; this reverses the sublist in right - left moves.

Input1→2→3→4→5, left=2, right=4
Output1→4→3→2→5
Only the middle three nodes flip.

def reverse_between(head, left, right):
    dummy = ListNode(0, head)
    prev = dummy
    for _ in range(left - 1):
        prev = prev.next
    cur = prev.next
    for _ in range(right - left):
        moved = cur.next
        cur.next = moved.next
        moved.next = prev.next
        prev.next = moved
    return dummy.next
function reverseBetween(head, left, right) {
  const dummy = { val: 0, next: head };
  let prev = dummy;
  for (let i = 1; i < left; i++) prev = prev.next;
  const cur = prev.next;
  for (let i = 0; i < right - left; i++) {
    const moved = cur.next;
    cur.next = moved.next;
    moved.next = prev.next;
    prev.next = moved;
  }
  return dummy.next;
}
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy = new ListNode(0, head), prev = dummy;
        for (int i = 1; i < left; i++) prev = prev.next;
        ListNode cur = prev.next;
        for (int i = 0; i < right - left; i++) {
            ListNode moved = cur.next;
            cur.next = moved.next;
            moved.next = prev.next;
            prev.next = moved;
        }
        return dummy.next;
    }
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
    ListNode dummy(0, head);
    ListNode* prev = &dummy;
    for (int i = 1; i < left; ++i) prev = prev->next;
    ListNode* cur = prev->next;
    for (int i = 0; i < right - left; ++i) {
        ListNode* moved = cur->next;
        cur->next = moved->next;
        moved->next = prev->next;
        prev->next = moved;
    }
    return dummy.next;
}
Time: O(n) Space: O(1)