LeetCode 25. K 个一组翻转链表 - Go 实现

本文介绍了一种链表每K个节点一组进行翻转的方法,包括递归实现及常数额外空间的要求,并提供了AC代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

进阶:

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

示例 1:
在这里插入图片描述在这里插入图片描述

思路

大致过程可以分解为
1、找到待翻转的k个节点(注意:若剩余数量小于 k 的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。
2、对其进行翻转。并返回翻转后的头结点(注意:翻转为左闭又开区间,所以本轮操作的尾结点其实就是下一轮操作的头结点)。
3、对下一轮 k 个节点也进行翻转操作。
4、将上一轮翻转后的尾结点指向下一轮翻转后的头节点,即将每一轮翻转的k的节点连接起来。

简单的来说,就是递归

AC 代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseKGroup(head *ListNode, k int) *ListNode {

    if head == nil || head.Next == nil {
        return head
    }

    tail := head
    for i := 0; i < k; i++ {
        if tail == nil {
            return head
        }
        tail = tail.Next 
    }
    newHead := reverse(head, tail)
    head.Next = reverseKGroup(tail, k)

    return newHead
}

func reverse(head *ListNode, tail *ListNode) *ListNode {
    pre := new(ListNode)
    next := new(ListNode)
    for head != tail {
        next = head.Next
        head.Next = pre 
        pre = head
        head = next
    }
    return pre 
}
参考资料
  • 链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
  • 链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution
欢迎关注公众号: 程序员开发者社区

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wangxiaoming

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

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

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

打赏作者

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

抵扣说明:

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

余额充值