# 92. Reverse Linked List II

#### Medium

***

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*.

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2021/02/19/rev2ex2.jpg)

```
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]
```

&#x20;

**Constraints:**

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

&#x20;

**Follow up:** Could you do it in one pass?

```python
class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        if left == right or not head:
            return head
        starting = head
        stack = []
        count = 0
        leftNodePrev = None
        rightNodeNext = None
        prev = None
        while head:
            count += 1
            if left <= count <= right:
                if left == count:
                    leftNodePrev = prev
                if right == count:
                    rightNodeNext = head.next
                stack.append(head)
            prev = head
            head = head.next
        d = dummy = ListNode()
        while stack:
            dummy.next = stack.pop()
            dummy = dummy.next
        if leftNodePrev:
            leftNodePrev.next = d.next
        else:
            starting = d.next
        dummy.next = rightNodeNext
        return starting

```
