本题介绍链表里的头插法。
1.思路
1)前进到反转开始处附近
2)头插法
头插法:
1)3插到2前
2)4插到3前
3)完成2->3->4到4->3->2的反转
注意防止断链,具体方法细节在代码的注释中。
首先防止q前插导致下一循环断链,记录下q.next;
然后插入q在头部(两步);
最后初始化下一循环p,q。
2.代码
class Solution:
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
dummy = ListNode(0)
dummy.next = head
loc = dummy
for i in range(m - 1):
loc = loc.next
p = loc.next
q = p.next
for i in range(n - m):
p.next = q.next #防止断链,将q的下一个地址给p.next
q.next = loc.next #将q.next指向loc固定指针的下一个,开始头插
loc.next = q #loc固定指针的next指向q,插入完成
q = p.next #初始化下一循环的q位置
#p、q每一次循环都后移一个单位,因为头插p自动后移,所以q是p的next即可
return dummy.next