LeetCode 25. K 个一组翻转链表

  • Post author:
  • Post category:其他


这道题看上去还是比较晦涩的,成功被带走了一个小时

本题的描述是给定一个链表

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

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

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

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

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

下面来看看官方的解法

class Solution:
    # 翻转一个子链表,并且返回新的头与尾
    def reverse(self, head: ListNode, tail: ListNode):
        prev = tail.next
        p = head
        while prev != tail:
            nex = p.next
            p.next = prev
            prev = p
            p = nex
        return tail, head

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        hair = ListNode(0)
        hair.next = head
        pre = hair

        while head:
            tail = pre
            # 查看剩余部分长度是否大于等于 k
            for i in range(k):
                tail = tail.next
                if not tail:
                    return hair.next
            nex = tail.next
            head, tail = self.reverse(head, tail)
            # 把子链表重新接回原链表
            pre.next = head
            tail.next = nex
            pre = tail
            head = tail.next
        
        return hair.next


解读一下代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如果不懂其中的子链表翻转那一块可以 参考这个链表翻转,自己画个图


https://blog.csdn.net/weixin_43184615/article/details/84376790?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158993906119724848309252%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=158993906119724848309252&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2

all

first_rank_ecpm_v3~pc_rank_v2-4-84376790.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E9%93%BE%E8%A1%A8%E7%BF%BB%E8%BD%ACc%2B%2B


画图要按照链表的格式来画,松散法,不要放在一个表格里,那样会陷入固定思维

因为链表的存储形式就是松散存储,我用了两个小时理解了链表翻转那个函数,剩下的就是不够k的把它直接连到原来的链表就可以了

力扣原文链接


https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/



版权声明:本文为delete_bug原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。