K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
- 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1输出:[1]
思路:
这道题也是反转链表的变式,我们依然可以用递归解决。我们使用的主要函数就是 reverseKGroup(head,k),它的任务就是:传入头结点head,并反转从头结点开始的k个节点;最后将新尾结点指向reverseKGroup(第k+1个节点,k),返回新头结点。
就通过这么一个函数,我们就可以实现k个一组反转了。接下来就需要定义一下base case,如当剩余节点不足k个时;以及需要定义一个reverse工具函数,帮我们实现具体反转操作。
具体反转实现我们使用reverse(left,right),这里有个小技巧,它是进行“左闭右开”的反转,即它只负责反转left到right-1的节点,不包括right。让right是下一组的“头结点”,这样就可以保证,反转结束之后,left成为了新的末尾节点,直接指向right即可。
代码:
class Solution(object):
#定义反转k个节点函数
def reverseKGroup(self, head, k):
#进行“左闭右开”的反转,包括left但不包括right,反转到right的前一个节点
def reverse(left,right):#reverse函数传入链表的首尾节点,返回反转后链表的头结点
pre = None
cur = left
nex = None
while(cur!=right):#迭代方式反转链表,基本操作了
nex = cur.next
cur.next = pre
pre = cur
cur = nex
return pre
#正式开始
a = head
b = head
for i in range(k):
if b==None:#如果b走到头了,即不足k个 base case
return head#直接返回当前的头结点
b = b.next#b一直向前走
new_head = reverse(a,b)#拿到了这一组的首尾,直接反转
#但上面只反转[a,b-1]节点,b节点依然是下一组的开头
a.next = self.reverseKGroup(b,k)#此时a变成了这一组的末尾节点
#把下一组b继续送入递归,a指向它即可
return new_head
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了