Python实现k个一组的链表反转

本文介绍了如何使用Python解决LeetCode上的「K个一组翻转链表」问题。通过创建辅助哑节点,分组并反转链表的子部分,然后更新节点指针,实现了链表的分组翻转。示例代码展示了对于给定链表1->2->3->4->5,当k分别为2和3时,如何得到正确翻转后的链表。
摘要由CSDN通过智能技术生成

题目描述

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

LeetCode原题地址:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

测试用例

  • 示例

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

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

代码实现

我们可以将这个问题拆分成两个子问题,首先将链表进行分组,再将分组后的子链表进行反转。关于链表的反转可以参考我的这篇文章Python实现反转链表

需要注意的是:在对子链表进行反转之后,记得要更新节点的指向。

class ListNode:
    def __init__(self,val,next=None):
        if isinstance(val,int):
            self.val = val
            self.next = next
        elif isinstance(val,list):
            self.val = val[0]
            self.next = None
            head = self
            for i in range(1,len(val)):
                node = ListNode(val[i])
                head.next = node
                head = head.next

class Solution:
    def reverseListNode(self,head:ListNode,tail:ListNode):
        """反转子链表
        :param head:链表的头节点
        :param tail:链表的尾结点
        :return:反转之后链表的头结点和尾结点
        """
        prev = tail.next
        current = head
        while prev != tail:
            next = current.next
            current.next = prev
            prev = current
            current = next
        return tail,head

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        #创建一个哑结点
        dummy_head = ListNode(0)
        dummy_head.next = head
        prev =dummy_head

        while head:
            tail = prev
            for i in range(k):
                tail = tail.next
                if not tail:
                    return dummy_head.next
            next = tail.next
            #反转子链表
            head,tail = self.reverseListNode(head,tail)
            #更新节点的指向
            prev.next = head
            tail.next = next
            #处理后面的子链表
            prev = tail
            head = tail.next

        return dummy_head.next

l = [1,2,3,4,5]
list_node = ListNode(l)
obj = Solution()
reve_node = obj.reverseKGroup(list_node,2)
while reve_node:
    print(reve_node.val)
    reve_node = reve_node.next

参考:K 个一组翻转链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值