# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param m int整型
# @param n int整型
# @return ListNode类
#
class Solution:
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
# 定义空头节点,避免特殊逻辑
top = ListNode(1001)
top.next = head
# 寻找开始反转节点start、开始反转节点前一个节点pre
pre = top
idx1 = 0
while idx1 < m - 1:
pre = pre.next
idx1 += 1
start = pre.next
pre.next = None
# 寻找结束反转节点end、结束反转后一个节点post
end = start
idx1 = 0
while idx1 < n - m:
end = end.next
idx1 += 1
post = end.next
end.next = None
# start-end之间的反转,返回反转后的[head , tail]
reverseResult = self.reverse(start)
# 开始拼接三段
pre.next = reverseResult[0]
reverseResult[1].next = post
return top.next
def reverse(self , head: ListNode) -> List:
if head.next == None:
return [head , head]
nxtReverseResult = self.reverse(head.next)
head.next = None
nxtReverseResult[1].next = head
return [nxtReverseResult[0] , head]