题目
基本思路
我以开始竟然理解为只用把m,n两个地方的数值交换就可以了,我大概是撒比了。。。
后来理清思路,发现应该类似于以前学过的头插法,怎么理解这个头插法呢,我们以这个题目举例:
1 2 3 4 5 m=2 n=4
1 2 不动,我们从3开始 将3插入2的前头
1 3 2 再将4插入3前面,依次类推
思路有了,那我们怎么实现呢,链表的题目离不开画图,同时还要注意不能断链,所以我们要把前后指针都给他设置上,pre,cur,post都给整上。同时我写了几道链表的题目之后我发现,加上头结点,操作更方便哦~
画个草图来描述下过程吧:
1. 添加头节点dummy
2. pre指针指向dummy,然后向后移动m-1步,到达要逆置的前一个结点,然后将cur和post结点给他加上
3. 现在就到了画图的这个地方了,这个小步骤要执行n-m次(先把循环次数给他限定好了)
cur.next = post.next
要被逆置的第二个结点给他孤立起来,即3号结点,现在的格局是2->4post.next = pre.next
将3号结点前插,1->3- 现在3->2还没连上,再加语句
pre.next=post
- 得往后找到下一个结点啊,下一个被逆置的结点就是
post = cur.next
,即1->3->2->4
中的4号。
实现代码
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
prev = dummy
for i in range(m - 1):
prev = prev.next
cur = prev.next
post = cur.next
for i in range(n - m):
cur.next = post.next
post.next = prev.next
prev.next = post
post = cur.next
return dummy.next
运行结果
44 / 44 test cases passed.
Status: Accepted
Runtime: 36 ms