# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @param m int整型 # @param n int整型 # @return ListNode类 # """ 解题思路总结: 1.定义一个虚拟头结点res 指向head 2. 定义left 指针从res 开始 移动到 m 位置前一个位置,移动m-1 次 3. 定义 right 从left 位置继续移动n-m+1 次到达【m,n】区间末尾节点 4. tail =right.next 保存尾部 5. 切断链表 : leftNode 保存【m,n】 区间左端点,前一个的next指向None ,即left.next=None n位置right 的next 指向空 ,right.next=None 6. 将切出来的【n,m】区间的头节点 leftNode 传入reverse(leftNode) 反转这段链表 7. 将链表拼接起来 left.next=reverse(leftNode) 原来的lefteNode 反转之之后变成中间部分的尾部指向 tail: leftNode.next=tail 8.返回虚拟节点的next :res.next """ class Solution: def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode: # write code here # 定义一个链表反转 def reverse( head:ListNode)->ListNode: if not head or not head.next: # 一个节点或者空节点 print(head.val) return head cur =head pre=None while cur: next=cur.next cur.next=pre pre=cur cur =next return pre if not head or not head.next: return head if m>=n: return head # left 遍历到 m-1 位置 # 定义虚拟节点 res=ListNode(-1) res.next=head left =res k=m while k-1 >0: #移动到 left 前一个节点 left=left.next k-=1 right =left # 从left 开始走 n-m+1 k=n-m+1 # 移动区间右端点 while k>0: right=right.next k-=1 # # if left==right: # 不需要反转 # return head # 保存 right 后一个节点 保存尾部 # 切断 #print("right",left.val,right.val) leftNode=left.next left.next=None tail=right.next # 保存尾部 right.next=None # 反转中间 #print('mid',mid.val,right_next.val) new_mid=reverse(leftNode) left.next=new_mid # new_tail = new_mid # while new_tail.next: # new_tail=new_tail.next leftNode.next=tail # 原来的m 变成中间的尾部直接指向尾部 #print("tail",tail.val) # 拼接尾部 return res.next