萱仔求职复习系列——力扣
25. K 个一组翻转链表
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
我认为其实还是某一种反转链表,只不过变成一部分反转了,可以用递归来解决这个问题:
递归结束条件:当剩下的节点少于 k 个时,保持原有顺序,不再翻转。
递归处理:每次递归处理 k 个节点,翻转它们,然后将翻转后的部分与递归处理的剩余部分连接起来。
翻转部分链表:我们需要在每次递归时翻转 k 个节点,翻转完成后将新的头节点返回,并递归连接。
class Solution:def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:# 检查链表是否有足够的节点进行翻转count = 0ptr = headwhile count < k and ptr:ptr = ptr.nextcount += 1# 如果节点数大于等于k,则进行翻转if count == k:# 翻转前k个节点prev = Nonecurr = headfor _ in range(k):next_node = curr.nextcurr.next = prevprev = currcurr = next_node# 递归处理剩余的部分,并连接回翻转后的部分head.next = self.reverseKGroup(ptr, k)# 返回新的头节点return prev# 如果节点数不足k,保持原样return head