题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

package main


/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
func reverseKGroup( head *ListNode ,  k int ) *ListNode {
    // 使用递归
    // 找到第一组尾部
    node := head
    // 每次从进入函数的头节点优先遍历链表k次,分出一组,若是后续不足k个节点,不用反转直接返回头
    if node == nil || node.Next == nil {
        return head
    }
    for i := 1; i < k; i++ {
        if node.Next == nil {
            return head
        }
        node = node.Next
    }
    temp := node.Next
    node.Next = nil
    // 从进入函数的头节点开始,依次反转接下来的一组链表
    newHead := revers(head)
    // 这一组经过反转后,原来的头变成了尾,后面接下一组的反转结果,下一组采用上述递归继续
    head.Next = reverseKGroup(temp, k)
    return newHead
}

// 反转链表
func revers(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    var pre *ListNode
    cur := head
    for cur != nil {
        pre, cur, cur.Next = cur, cur.Next, pre
    }
    return pre
}

全部评论

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
nbdy:她的意思是,有的话就有,没有的话就没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务