反转链表Ⅱ

92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1输出:[5]

进阶: 你可以使用一趟扫描完成反转吗?

思路:

  这一题在翻转整个链表的基础上控制了翻转区间。首先我们需要定义内部的用于进行反转链表的递归函数,因为我们不再是对于给入的头节点直接反转到底了,所以此时我们的反转函数reverse()除了参数head,还需要参数k来控制反转的长度

  所以整个reverse(head,k)的作用就是:传入头节点head,反转从head起的k个节点,并返回新的头节点(也就是第k个节点)。它的实现方式就是不断地用head.next和k-1去调用自身,并且定义好base case也就是k=1的情况。

  但是在整个程序的外部,我们传入的是左右边界left和right。因此我们再最外层也要进行递归。题目中给的函数reverseBetween(self, head, left, right)也可以当作是递归函数,并且它的反转功效等同于reverseBetween(self, head.next, left-1, right-1),而当left=1时,就可以进行reverse函数的调用了。

代码:

class Solution(object):

    def reverseBetween(self, head, left, right):

        cur=[None]

        def rever(head,k):#反转链表操作,多了一个参数k

            if k==1:#如果反转长度等于1,也就是base的情况

                cur[0]=head.next#直接让当前节点指向None

                return head#返回当前节点

            else:

                #得到新的头节点last

                last = rever(head.next,k-1)
                    #rever(head,k)反转功效等同于rever(head.next,k-1)

                head.next.next=head#把head变成末尾节点

                head.next = cur[0]#并且让末尾节点指向None

                return last#返回新的头节点

        #最外层函数的第一步,先判断left

        if left==1:#如果left为1,就可以进行rever函数的调用了

            return rever(head,right)

        else:#否则就送入递归即可,别的不用管 直到left变成1

            head.next = self.reverseBetween(head.next,left-1,right-1)

            return head

小结:

  从内到外我们用了两个递归函数,但是无需进入递归中理解,只需要清楚外层递归reverseBetween()以及内部递归rever()的作用,搞清楚他门的输入输出,就很轻松理解了。只要定义好递归函数的作用和功效,接下里就交给计算机去实现吧。

posted @   JunanP  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示