【算法 -- LeetCode】(025) K 个一组翻转链表

2023-11-12

在这里插入图片描述

1、题目

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

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

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

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

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

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

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

2、图解

题目要求在一个链表中以 k 个链表节点为单位进行反转,什么意思呢?

你可以想象把一个很长的链表分成很多个小链表,每一份的长度都是 k (最后一份的长度如果小于 k 则不需要反转),然后对每个小链表进行反转,最后将所有反转后的小链表按之前的顺序拼接在一起。

其实 链表的题目并不需要特别强的逻辑推理,它主要强调细节实现,难也是难在细节实现上面 ,虽然大致的方向知道,但是很可能写着写着就会乱

所以这个题目实现的时候要把握住几个要点:

  • 第一,在反转子链表的时候,上一个子链表的尾必须知道

  • 第二,下一个子链表的头也必须知道

  • 第三,当前反转的链表的头尾都必须知道

3、Java 示例代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null || k <= 1) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pointer = dummy;

        while (pointer != null) {
            // 记录上一个子链表的尾
            ListNode lastGroup = pointer;

            int i = 0;            
            for (; i < k; ++i) {
                pointer = pointer.next;
                if (pointer == null) {
                    break;
                }
            }

            // 如果当前子链表的节点数满足 k, 就进行反转
            // 反之,说明程序到尾了,节点数不够,不用反转
            if (i == k) {
                // 记录下一个子链表的头
                ListNode nextGroup = pointer.next;

                // 反转当前子链表,reverse 函数返回反转后子链表的头
                ListNode reversedList = reverse(lastGroup.next, nextGroup);

                // lastGroup 是上一个子链表的尾,其 next 指向当前反转子链表的头
                // 但是因为当前链表已经被反转,所以它指向的是反转后的链表的尾
                pointer = lastGroup.next;

                // 将上一个链表的尾连向反转后链表的头
                lastGroup.next = reversedList;

                // 当前反转后的链表的尾连向下一个子链表的头
                pointer.next = nextGroup;
            }
        }

        return dummy.next;
    }

    private ListNode reverse(ListNode head, ListNode tail) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode prev = null, temp = null;
        while ((head != null) && (head != tail)) {
            temp = head.next;
            head.next = prev;
            prev = head;
            head = temp;
        }

        return prev;
    }
}

执行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法 -- LeetCode】(025) K 个一组翻转链表 的相关文章

随机推荐

  • java spring scope_java – Spring和scope属性

    我在Spring学习中遇到问题 需要一些帮助 我正在学习bean的原型范围 这基本上意味着每次有人或其他bean需要这个bean时 Spring会创建一个新bean而不使用相同的bean 所以我尝试了这段代码 假设我有这个Product类
  • DPDK+Pktgen 高速发包测试

    Pktgen概述 Pktgen Packet Gen erator 是一个基于DPDK的软件框架 发包速率可达线速 提供运行时管理 端口实时测量 可以控制 UDP TCP ARP ICMP GRE MPLS and Queue in Que
  • 在微软工作365天,还你一个我眼中更加真实的微软

    去年12月28日 我正式成为了微软中国的一名员工 今天又是12月28日 不知不觉我已经在这里工作365天了 其实在入职100天的时候我就写过一篇关于微软的文章 详见 在微软工作100天 谈谈我眼中的微软 但那个时候毕竟待的时间还比较短 所以
  • 零基础入门金融风控 Task2 数据分析

    文章目录 1 导入数据分析及可视化过程需要的库 2 读取文件 3 总体了解 4 查看数据集中特征缺失值 唯一值等 5 查看特征的数值类型有哪些 对象类型有哪些 6 变量分布可视化 6 时间格式数据处理及查看 7 掌握透视图可以让我们更好的了
  • 【Linux工具】-yum/gdb

    yum gdb 一 yum 1 简介 2 软件下载 3 软件删除 4 yum源与扩展yum源 5 常见选项 二 gdb 1 简介 2 gdb相关指令 一 yum 1 简介 在Linux下 下载软件通常的方法是下载源代码 然后进行编译得到可执
  • 【单片机毕业设计】【mcuclub-yq-001】基于单片机的翻蛋器 孵化器的设计

    最近设计了一个项目基于单片机的翻蛋器 孵化器系统 与大家分享一下 一 基本介绍 项目名 翻蛋器 孵化器 项目编号 mcuclub yq 001 单片机类型 STC89C52 STM32F103C8T6 具体功能 1 通过DS18B20测量温
  • 学习Java第三天——手机类的创建与使用

    需求 定义一个手机类 然后定义一个手机测试类 在手机测试类中通过对象完成成员变量和成员方法的使用 学习时间 2022 6 21凌晨 程序 成员变量 品牌 价格 成员方法 打电话 发短信 手机类 package com pipi test1
  • 第06篇 开闭原则

    一 定义 开闭原则 Open Closed Principle OCP 一个软件实体应当对扩展开放 对修改关闭 即软件实体应尽量在不修改原有代码的情况下进行扩展 开闭原则是面向对象的可复用设计的第一块基石 它是最重要的面向对象设计原则 二
  • 【gitHubDailyShare】开源的 C++ 入门学习资源,C++ 匠心之作

    分享 GitHub 上一份开源的 C 入门学习资源 Cpp 0 1 Resource 主要包含以下内容 第 1 阶段 C 匠心之作 从 0 到 1 入门 第 2 阶段实战 通讯录管理 第 3 阶段 C 核心编程 第 4 阶段实战 基于多态的
  • 解决ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

    ERROR 2003 HY000 Can t connect to MySQL server on localhost 3306 10061 1 安装成功之后输入MYSQL报出ERROR 2003 HY000 Can t connect t
  • 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列 上一篇第五篇 基于背景差分法的视频目标运动侦测 一 网络爬虫简介 Python3 网络爬虫 大家应该不陌生了 接下来援引一些Jack Cui在专栏 Python3网络爬虫入门 中的内容来帮助初学者理解
  • QT 如何修改工程(项目)名?

    前因 我们有时候一开始起的项目名到后面并不合乎心意时 而且项目里面的大多数类都是重复的 此时我们只想修改一下工程名即可 步骤如下 在这里假设我原来的工程名字是test 想要修改成名字为demo 第一步 打开工程文件夹 除了test pro以
  • 【JVM】JVM垃圾回收机制GC

    文章目录 JVM垃圾回收机制 一 堆内存区域划分 1 1内存分配策略 1 2永久代 Permanent Generation 1 3元空间 MetaSpace 二 标记算法 2 1引用计数算法 2 2可达性分析算法 2 3引用 强引用 Ha
  • Matlab中读取excel表格数据

    一 Matlab中读取excel表格数据步骤讲解 第二步 第三步 第四步 第五步 第六步 第七步 输入之后按回车键 就会出现相应的波形 效果图
  • 链接、装载与库——编译与链接

    从第二章开始不再按照目录的顺序总结 而是将大块知识点总结在一起 第二章 编译和链接 集成开发环境 IDE 一般都将编译和链接的过程一步完成 此过程成为构建 Bulid 但其掩盖了系统软件运行机制 gcc hello c a out 一个可执
  • win10离线安装ros-melodic-desktop_full

    在线安装最容易出现安装包下载不了导致的安装失败问题 本篇文章续上篇在线安装 安装在线包 下载ros melodic desktop full 下载地址 ros melodic离线包下载地址 开始菜单中 右键 x64 Native Tools
  • Codeforces Round 875 (Div. 1) A. Copil Copac Draws Trees

    题意 Copil Copac 给定了一个由 n 1 条边组成的列表 该列表描述了一棵由 n 个顶点组成的树 他决定用下面的算法来绘制它 步骤 0 绘制第一个顶点 顶点1 转到步骤1 步骤 1 对于输入中的每一条边 依次 如果该边连接一个已经
  • 【完全开源】小安派-Cam-U 摄像头核心板

    一 概述 小安派 Cam U AiPi Cam U 是安信可开源团队专门为Ai M61 32S设计的一款开发板 支持WiFi6 BLE5 3 所搭载的Ai M61 32S 模组具有丰富的外设接口 具体包括 DVP MJPEG Dispaly
  • [4G&5G专题-120]:培训-跟小朋友聊通信

    用小孩子的语言与小朋友聊通信
  • 【算法 -- LeetCode】(025) K 个一组翻转链表

    1 题目 给你链表的头节点 head 每 k 个节点一组进行翻转 请你返回修改后的链表 k 是一个正整数 它的值小于或等于链表的长度 如果节点总数不是 k 的整数倍 那么请将最后剩余的节点保持原有顺序 你不能只是单纯的改变节点内部的值 而是