Problem 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:

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

Example 2:

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

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
if not head:
return head
dummy, dummy.next = ListNode(0), head
p = dummy

for _ in range(left-1):
p = p.next
tail = p.next

for _ in range(right-left):
tmp = p.next # a)
p.next = tail.next # b)
tail.next = tail.next.next # c)
p.next.next = tmp # d)
return dummy.next

time complexity: $O(n)$
space complexity: $O(1)$
reference:
related problem: