【python/M/92】Reverse Linked List II

题目

这里写图片描述

基本思路

我以开始竟然理解为只用把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->4
  • post.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

猜你喜欢

转载自blog.csdn.net/alicelmx/article/details/81198449