

- 找到区间的pre、left、right、nxt,保存
- 区间反转
- pre.next 连接新头(right)
- 区间尾巴(原来的left)接上nxt
python
# 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]:
# 1. 找区间的pre、next 节点
pre = ListNode(0)
pre.next = head
dummy = pre
for i in range(left-1):
pre = pre.next
# 此时pre.next = 区间头节点
left_node = pre.next
right_node = head
for i in range(right-1):
right_node = right_node.next
# 2. 反转区间
cur = left_node
# 断首尾
prev = ListNode(0)
prev.next = left_node # 给个暂时的节点,指向区间left
nxt = right_node.next # 保存原始区间next
while cur != nxt: # 结束时cur已经出区间了,这样区间内才反转完
tmp = cur.next # 保存原始区间next
cur.next = prev
prev = cur
cur = tmp
pre.next = right_node # 原来的区间pre_node 指向原来的尾节点(现在的left)
left_node.next = nxt # 现在的尾节点(原来的left)指向保存好的nxt
return dummy.next