25. K 个一组翻转链表

这篇博客介绍了如何解决LeetCode中的‘K个一组翻转链表’问题,通过创建一个dummy节点辅助,以及反转子链表的技巧,实现了在O(1)额外空间复杂度下完成链表翻转。文章详细阐述了翻转子链表的过程,以及如何根据k值处理不足k个节点的情况,最后给出了完整的Python代码实现。
摘要由CSDN通过智能技术生成

25. K 个一组翻转链表

原始题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

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

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

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

进阶:

你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路:

  • 首先是要想出反转链表的操作,给出一个链表的子链表(起始节点),返回反转后的子链表的头结点和尾节点,将这个反转后的子链表再重新链接到原始链表中,重新链接到原始链表就需要知道还没有反转前的子链表起始节点(头结点和尾节点)的前驱节点和后继节点,所以用两个指针分别存储前驱pre和后继ail_next_node。
  • 其次是k个一组,走k步,走k步正好走到子链表的尾部,不满足子链表长度就表示,原始链表本身不够长,或者剩余链表的长度不满足k个,这个时候直接返回新的头结点即可。
  • 为了方便操作,设置一个dummy节点,它的next指针指向head,最后直接返回dummy.next就是新的头节点。

代码实现:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:

    # 反转一个链表中的一段子链表函数,返回反转后子链表的头结点和尾节点
    def reverse(self, head: ListNode, tail: ListNode):
        tail_next_node = tail.next
        cur_node = head
        
        while tail_next_node != tail:
            cur_next_node = cur_node.next
            cur_node.next = tail_next_node
            tail_next_node = cur_node
            cur_node = cur_next_node
        
        return tail, head 

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head
        pre = dummy
        cur_head = head

        while cur_head:
            # 初始为pre,走k步,则正好走到子链表的尾节点
            tail = pre
            # 走k步
            for i in range(k):
                tail = tail.next
                # 判断子链表的长度是否等于k
                if not tail:
                    return dummy.next

            # 记录子链表的下一个节点,用于反转后的子链表的尾节点指向该节点
            tail_next_node = tail.next
            # 反转子链表,并返回新的头结点和尾节点
            cur_head, tail = self.reverse(cur_head, tail)

            # 把反转后的子链表重新链接指向原链表
            pre.next = cur_head
            tail.next = tail_next_node
            pre = tail
            cur_head = tail.next
        
        return dummy.next

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值