# 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