萱仔求职复习系列——力扣

25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

我认为其实还是某一种反转链表,只不过变成一部分反转了,可以用递归来解决这个问题:

递归结束条件:当剩下的节点少于 k 个时,保持原有顺序,不再翻转。

递归处理:每次递归处理 k 个节点,翻转它们,然后将翻转后的部分与递归处理的剩余部分连接起来。

翻转部分链表:我们需要在每次递归时翻转 k 个节点,翻转完成后将新的头节点返回,并递归连接。

class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        # 检查链表是否有足够的节点进行翻转
        count = 0
        ptr = head
        while count < k and ptr:
            ptr = ptr.next
            count += 1
        
        # 如果节点数大于等于k,则进行翻转
        if count == k:
            # 翻转前k个节点
            prev = None
            curr = head
            for _ in range(k):
                next_node = curr.next
                curr.next = prev
                prev = curr
                curr = next_node
            
            # 递归处理剩余的部分,并连接回翻转后的部分
            head.next = self.reverseKGroup(ptr, k)
            
            # 返回新的头节点
            return prev
        
        # 如果节点数不足k,保持原样
        return head

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值