You are 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 (1-indexed), and return the reversed list.
Example 1:
Input: head = [1,2,3,4,5], left = 1, right = 3
Output: [3,2,1,4,5]Example 2:
Input: head = [1,1], left = 1, right = 1
Output: [1,1]Constraints:
n.1 <= n <= 500.-500 <= Node.val <= 5001 <= left <= right <= nFollow up: Could you do it in one pass?
# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
dummy = ListNode(0)
dummy.next = head
prev = dummy
for _ in range(left - 1):
prev = prev.next
sublist_head = prev.next
sublist_tail = sublist_head
for _ in range(right - left):
sublist_tail = sublist_tail.next
next_node = sublist_tail.next
sublist_tail.next = None
reversed_sublist = self.reverseList(sublist_head)
prev.next = reversed_sublist
sublist_head.next = next_node
return dummy.next
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head:
return None
newHead = head
if head.next:
newHead = self.reverseList(head.next)
head.next.next = head
head.next = None
return newHead# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
def reverseList(node, n):
if n == 1:
return node, node.next
new_head, next_node = reverseList(node.next, n - 1)
node.next.next = node
node.next = next_node
return new_head, next_node
if left == 1:
new_head, _ = reverseList(head, right)
return new_head
head.next = self.reverseBetween(head.next, left - 1, right - 1)
return head# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
dummy = ListNode(0)
dummy.next = head
prev = dummy
for _ in range(left - 1):
prev = prev.next
sublist_head = prev.next
sublist_tail = sublist_head
for _ in range(right - left):
sublist_tail = sublist_tail.next
next_node = sublist_tail.next
sublist_tail.next = None
reversed_sublist = self.reverseList(sublist_head)
prev.next = reversed_sublist
sublist_head.next = next_node
return dummy.next
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev, curr = None, head
while curr:
temp = curr.next
curr.next = prev
prev = curr
curr = temp
return prev# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
dummy = ListNode(0, head)
leftPrev, cur = dummy, head
for _ in range(left - 1):
leftPrev, cur = cur, cur.next
prev = None
for _ in range(right - left + 1):
tmpNext = cur.next
cur.next = prev
prev, cur = cur, tmpNext
leftPrev.next.next = cur
leftPrev.next = prev
return dummy.next