| 1 | class Solution: |
| 2 | def reverseBetween( |
| 3 | self, head: Optional[ListNode], left: int, right: int |
| 4 | ) -> Optional[ListNode]: |
| 5 | dummy = ListNode(0, head) |
| 6 | |
| 7 | # 1) reach node at position "left" |
| 8 | leftPrev, cur = dummy, head |
| 9 | for i in range(left - 1): |
| 10 | leftPrev, cur = cur, cur.next |
| 11 | |
| 12 | # Now cur="left", leftPrev="node before left" |
| 13 | # 2) reverse from left to right |
| 14 | prev = None |
| 15 | for i in range(right - left + 1): |
| 16 | tmpNext = cur.next |
| 17 | cur.next = prev |
| 18 | prev, cur = cur, tmpNext |
| 19 | |
| 20 | # 3) Update pointers |
| 21 | leftPrev.next.next = cur # cur is node after "right" |
| 22 | leftPrev.next = prev # prev is "right" |
| 23 | return dummy.next |