反转链表Ⅱ
给你单链表的头指针 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()的作用,搞清楚他门的输入输出,就很轻松理解了。只要定义好递归函数的作用和功效,接下里就交给计算机去实现吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了