解题思路:

  1. 链表的插入结点必须先链后断,否则结点会迷失在内存中
q -> NewNode
q.next = p.next
p.next = q

  1. 链表的指向必须有理有据,q.next一定要有现存的根据
  2. 对于链表的各种插入交换,不能战线拉太长考虑全局,也不能战线放太短就考虑一个或者两个结点,最好来说就是三个: pre p q
    pre指向当前结点的上一个结点
    p指向当前结点
    q指向当前结点的下一个结点
    (在这隐含第四个结点,即q.next)
  3. 置换
p.next = q.next  # # p的下一个结点指向q的下一个结点
q.next = pre.next  # # q的下一个结点指向p
pre.next = q  # # pre的下一个结点指向q
q = p.next  # # q瞬移
  1. 观察代码不难发现,除了最开始需要把三个指针拎清楚,在后面运行的过程中,只需要把q的位置搞清楚就行了
  2. 极力推荐画图,画出四个结点倒腾一遍就能有一些些感觉
#     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 m >= n:
            return head
        res = ListNode(-1)
        i = 0
        res.next = head
        pre = res
        p = head
        q = p.next
        while q:
            i += 1
            if i >= m and i < n:
                p.next = q.next
                q.next = pre.next
                pre.next = q
                q = p.next
            else:
                pre = pre.next
                p = p.next
                q = q.next
        return res.next