25. K个一组反转链表(python)

题目

(困难)给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。

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

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

解答

解法如下:

  1. 我们定义一个函数reverse_nodes,函数的输入是一个结点和一个正整数k,用于将该结点后的k个结点进行逆序操作;
  2. 遍历链表,定义末尾探测器,探测下一个逆序单元中结点的个数是否足够k个,如果不够则直接返回当前的结果,不对剩余结点进行逆序;
  3. 如果下一个逆序单元中结点个数够k个,则调用reverse_nodes函数对当前结点之后的k个结点进行逆序。
class Solution:
    def reverseKGroup(self, head, k):
        pre_head = ListNode(0)
        pre_head.next = head
        pre = pre_head

        def reverse_nodes(pre, k):
            """
            将pre后的k个结点逆序
            :param pre:
            :return:
            """
            cur = pre.next

            for _ in range(k - 1):
                
                later = cur.next
                cur.next = later.next
                later.next = pre.next
                pre.next = later

            pre = cur

            return pre

        while pre.next:
            tmp = pre.next
            count = 1

            # 探索当前结点之后是否足够k个结点
            while count < k and tmp:
                tmp = tmp.next
                count += 1

            if tmp:         # 如果并没有到达链表末尾
                pre = reverse_nodes(pre, k)

            else:           # 到达链表末尾
                break

        return pre_head.next

如有任何疑问,欢迎评论区留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容