# 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
if not head:
return None
cur = head #用于找第m个对象,默认为头指针
pre = None #初始时,pre为空,找到第m个对象后,再赋值
last = head #用于找第n个对象,默认为头指针
lastnext = None#初始时,n的下一个对象为空,下面找到last后,再赋值
if m > 1:#当m=1时,cur=head,pre=None。大于1时才需要往后查找。
i = 1
while i < m-1: #m-2次移动找到pre前置的指针位置
cur = cur.next
i += 1
pre = cur #移动后的指针赋值给pre
cur = cur.next#移动后当前指针的next对象赋值给cur
i = 1
while i < n:#n-1次指针移动快速移动到n对应的对象。
last = last.next
i += 1
lastnext = last.next #找到n号对象的下一个对象指针
k = lastnext #把m-n的链表对象单独拿出来,cur指针是该小链表的头指针,lastnext是链表最后一个对象指向的位置。
while cur != lastnext:#把小链表拆开,把第一个对象拿出来,下一跳指向lastnext,重复把第二个拿出来,下一跳指向第一个对象。
temp = cur.next #缓存当前的下一个指针
cur.next = k #把当前的下一个指向lastnext
k = cur #移动参照指针k
cur = temp #移动当前指针到下一个。
if pre: #如果pre不为空,即m不等于1,需要把小链表的头指针赋值给pre下一跳
pre.next = k #链表拼接,把当前小链表的头指针赋值给pre下一跳。
return head
else:#如果m=1,即pre为空,小链表的头指针即大链表的头指针。
return k