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