# 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:
# write code here
# 保留原始头节点的初始指针
flag = ListNode(-1)
flag.next = head
# 初始化前一个节点和当前节点。
previous = flag
current = head
idx = 1
# 链表被拆分为了3个部分:[1, m), [m, n], [n+1, end],并分别进行处理。
# 处理[1, m)部分。
while idx < m:
# 第m个节点之前的节点,逐步后移就行,只需要记录到第m个节点的前一个节点的指针。
previous = current
current = current.next
idx += 1
# 记录第m个节点的前一个节点的指针,它将用于链接[1, m)和[m, n]这两部分。
previous_m = previous
# 记录第m个节点的指针。第m个节点是逆序链表的最后一个节点,它将用于链接[m, n]和[n+1, end]这两部分
current_m = current
# 处理[m, n]部分。对m到n之间的链表逆序。
while idx <= n:
# 保留下一个节点的指针,防止链表断开。
next_node_pointer = current.next
# 让当前节点的下一个变成它的上一个节点。
# 这一步会使逆序链表和它后面的链表断开,所以之前要记录第m个节点的指针,
# 之前的第m个节点是逆序链表的最后一个节点,
# 最后要让第m个节点的next指针指向第n个节点之后的链表,把链表链接完整。
current.next = previous
# 当前节点将作为下一次循环的上一个节点
previous = current
# 让指针指向下一个节点。
current = next_node_pointer
idx += 1
# 链表被拆分为了3个部分:[1, m), [m, n], [n+1, end]。
# 其中[m, n]部分被逆序。
previous_m.next = previous # 拼接[1, m)和 [m, n]这两部分为[1, n]。
current_m.next = current # 拼接[1, n)和[n+1, end]为[1, end]。
return flag.next