K个一组翻转链表

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