25. K 个一组翻转链表 - 力扣(LeetCode)

基础知识要求:

Java:方法、while循环、for循环、if else语句

Python: 方法、while循环、for循环、if else语句

题目: 

给你链表的头节点 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]

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

思路解析:

  1. 准备阶段
    • 首先,我们需要一个哑节点(dummy node)来简化头节点的处理。哑节点是一个不存储实际数据的节点,它的next指针指向链表的头节点。这样,我们就可以避免处理头节点翻转时的特殊情况。
    • 初始化三个指针:prev(前一个子链表的末尾节点)、curr(当前子链表的开始节点)和end(当前子链表的末尾节点)。开始时,prev指向哑节点,curr指向头节点。
  2. 循环处理阶段
    • 在每次循环中,我们首先使用getKthNode函数找到当前子链表的末尾节点end。如果endnull,说明剩下的节点数不足k个,我们不需要再翻转,直接结束循环。
    • 如果end不是null,说明当前子链表至少有k个节点,可以进行翻转。在翻转之前,我们需要保存下一个子链表的开始节点,即end.next,因为翻转后我们会丢失对它的引用。
    • 使用reverse函数翻转当前子链表。翻转后,curr(原来的开始节点)会变为翻转后的末尾节点,并且它的next指针会指向下一个子链表的开始节点。
    • 更新prevcurr的位置。prev指向curr(翻转后的末尾节点),curr指向下一个子链表的开始节点(即之前保存的end.next)。
  3. 结束阶段
    • 当循环结束后,我们得到了一个每k个节点一组翻转后的链表。这个链表的头节点是哑节点的next指针所指向的节点。
    • 返回哑节点的next指针作为结果。

Java代码示例:

public class ListNode {  
    int val;  
    ListNode next;  
    ListNode(int x) { val = x; }  
}  
  
public class Solution {  
    public ListNode reverseKGroup(ListNode head, int k) {  
        if (head == null || k <= 1) {  
            return head;  
        }  
  
        // 创建一个哑节点(dummy node),简化头节点处理  
        ListNode dummy = new ListNode(0);  
        dummy.next = head;  
  
        ListNode prev = dummy; // 前一个子链表的末尾节点  
        ListNode curr = head; // 当前子链表的开始节点  
  
        while (curr != null) {  
            // 计算当前子链表的末尾节点  
            ListNode end = getKthNode(curr, k);  
            if (end == null) {  
                // 不足k个节点,无需翻转,直接退出循环  
                break;  
            }  
  
            // 翻转当前子链表  
            ListNode nextGroup = end.next; // 下一个子链表的开始节点  
            end.next = null; // 切断当前子链表与后续链表的连接  
            prev.next = reverse(curr); // 翻转后的子链表连接到前一个子链表的末尾  
            curr.next = nextGroup; // 翻转后的子链表的末尾节点指向下一个子链表的开始节点  
  
            // 更新指针  
            prev = curr; // 前一个子链表的末尾节点移动到当前翻转后的子链表的末尾  
            curr = nextGroup; // 当前子链表的开始节点移动到下一个子链表的开始节点  
        }  
  
        return dummy.next; // 返回修改后的链表头节点  
    }  
  
    // 翻转链表  
    private ListNode reverse(ListNode head) {  
        ListNode prev = null;  
        ListNode curr = head;  
        while (curr != null) {  
            ListNode next = curr.next;  
            curr.next = prev;  
            prev = curr;  
            curr = next;  
        }  
        return prev; // 返回翻转后的头节点  
    }  
  
    // 获取第k个节点  
    private ListNode getKthNode(ListNode head, int k) {  
        ListNode curr = head;  
        for (int i = 0; i < k && curr != null; i++) {  
            curr = curr.next;  
        }  
        return curr;  
    }  
}

Python代码示例:

class ListNode:  
    def __init__(self, val=0, next=None):  
        self.val = val  
        self.next = next  
  
class Solution:  
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:  
        if not head or k <= 1:  
            return head  
  
        # 创建一个哑节点(dummy node),简化头节点处理  
        dummy = ListNode(0)  
        dummy.next = head  
  
        prev = dummy  # 前一个子链表的末尾节点  
        curr = head   # 当前子链表的开始节点  
  
        while curr:  
            # 计算当前子链表的末尾节点  
            end = self.getKthNode(curr, k)  
            if not end:  
                # 不足k个节点,无需翻转,直接退出循环  
                break  
  
            # 翻转当前子链表  
            next_group = end.next  # 下一个子链表的开始节点  
            end.next = None  # 切断当前子链表与后续链表的连接  
            prev.next = self.reverse(curr)  # 翻转后的子链表连接到前一个子链表的末尾  
            curr.next = next_group  # 翻转后的子链表的末尾节点指向下一个子链表的开始节点  
  
            # 更新指针  
            prev = curr  # 前一个子链表的末尾节点移动到当前翻转后的子链表的末尾  
            curr = next_group  # 当前子链表的开始节点移动到下一个子链表的开始节点  
  
        return dummy.next  # 返回修改后的链表头节点  
  
    # 翻转链表  
    def reverse(self, head: ListNode) -> ListNode:  
        prev = None  
        curr = head  
        while curr:  
            next_node = curr.next  
            curr.next = prev  
            prev = curr  
            curr = next_node  
        return prev  # 返回翻转后的头节点  
  
    # 获取第k个节点  
    def getKthNode(self, head: ListNode, k: int) -> ListNode:  
        curr = head  
        for _ in range(k):  
            if curr:  
                curr = curr.next  
            else:  
                return None  
        return curr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/624825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…

深入学习Linux内核之v4l2应用编程(二)

一&#xff0c;用户空间访问v4l2设备步骤 V4L2&#xff08;Video for Linux 2&#xff09;是Linux中关于视频设备的内核驱动&#xff0c;它使得Linux系统能够支持视频设备&#xff0c;如摄像头。对于Camera V4L2的应用编程&#xff0c;一般遵循以下步骤&#xff1a; 1&#x…

【正则表达式】1、元字符的认识与分类

1、元字符的概念 正则表达式的常见功能&#xff0c;分别是校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。 我想你一定在办公软件&#xff0c;比如 Word、Excel 中用过这个功能。你可以使用查找功能快速定位关注的内容&#xff0c;然后使用替换&#xf…

leetcode-最长公共子序列(二)-103

题目要求 思路 step 1&#xff1a;优先检查特殊情况。 step 2&#xff1a;获取最长公共子序列的长度可以使用动态规划&#xff0c;我们以dp[i][j]dp[i][j]dp[i][j]表示在s1中以iii结尾&#xff0c;s2中以jjj结尾的字符串的最长公共子序列长度。 step 3&#xff1a;遍历两个字…

视频号小店从开店到爆单,最详细的攻略教学,来了!

大家好&#xff0c;我是喷火龙 视频号小店从推出到现在一直备受关注&#xff0c;我的团队已经入局视频号小店一年多了&#xff0c; 可以说&#xff0c;新手做视频号小店采用无货源模式和达人带货的玩法依旧是最合适的。 虽然说这个模式和玩法很多人之前都接触过&#xff0c;…

精准追踪,高效分析——Xinstall应用数据分析平台

在当前的移动互联网时代&#xff0c;App应用的数量与日俱增&#xff0c;如何从这些应用中脱颖而出&#xff0c;成为开发者和广告主们亟待解决的问题。而在这个问题中&#xff0c;数据无疑是一把关键的钥匙。今天&#xff0c;我们要介绍的就是国内专业的App全渠道统计服务商——…

普中STM32F103ZET6开发板让DS0和DS1两个LED同时亮

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.运行效果 一.前言 在这套stm32教程中,只教学了如何亮DS0,而没有教学如何亮DS1。 二.代码 main.c #include "stm32f10x.h"void Syst

Linux下Redis下载及安装教程(实测有效)

一、配置gcc 由于Redis是基于c语言编写的需要安装依赖,需要安装gcc&#xff0c;在Linux系统里需要存在C语言的编译环境&#xff0c;一般的Linux系统安装的时候会自动安装&#xff0c;由于我是最小安装模式&#xff0c;所以我需要自己再另外安装一下。 判断系统是否安装gcc&…

2024年Java程序员的职业发展路径

程序员的职业路径是非常清晰的&#xff0c;但是现实情况下&#xff0c;很多人卡在了高级开发就再也上不去&#xff0c;直到遇到职业发展的危机&#xff0c;比如&#xff1a; 35岁大龄程序员找工作难&#xff0c;国内很多大型互联网公司在招聘要求上&#xff0c;会限制35岁这个年…

PuLID: 图像背景、光线、风格等均保持高度一致图像生成工具,附本地一键包

PuLID是一种无需调优的ID定制方法。PuLID保持了高的ID保真度&#xff0c;同时有效地减少了对原始模型行为的干扰。 只需要提供一张照片&#xff0c;就可以生成高还原度的各种风格的图像。 使用方法&#xff1a;解压一键包&#xff0c;双击一键启动 点击ID图像&#xff08;主…

李国武:确保FMEA实现预期质量目标的方法有哪些?

在现代制造业中&#xff0c;FMEA&#xff08;失效模式与影响分析&#xff09;已经成为一项至关重要的质量管理工具。它通过对产品或过程进行系统的分析&#xff0c;识别潜在的失效模式&#xff0c;评估其影响&#xff0c;并制定相应的预防措施&#xff0c;从而确保产品或过程的…

Nginx 代理 MySQL 实现通过域名连接数据库

文章目录 Nginx 模块介绍Stream 模块配置远程连接 MySQLDataGrip 连接 MySQL Nginx 安装这里不做介绍。域名默认已经解析到服务器公网IP。 Nginx 模块介绍 HTTP 模块&#xff1a; HTTP模块提供了处理HTTP请求的功能&#xff0c;包括反向代理、负载均衡、缓存、HTTP代理等。 例…

Docker下载镜像出现“missing signature key”如何解决?

“missing signature key” 通常与 Docker 配置有关&#xff0c;具体是 Docker 试图验证镜像的签名但未能找到相应的密钥。这种情况可能发生在启用了 Docker Content Trust (DCT) 的环境中&#xff0c;DCT 是一种安全功能&#xff0c;要求所有镜像必须有签名才能拉取。 原因 …

资料同化 | 搭建docker环境-1

Community Gridpoint Statistical Interpolation (GSI) system DTC 是一个分布式设施&#xff0c;NWP 社区可以在这里测试和评估用于研究和操作的新模型和技术。 DTC的目标包括&#xff1a; 链接研究和操作社区 研究成果转化为实际操作的速度 加快改善天气预报 开发和测试有…

独享静态IP:跨境网络新助手

在数字化浪潮席卷全球的今天&#xff0c;互联网已成为人们生活中不可或缺的一部分。而在这个由数据和信息构成的虚拟世界里&#xff0c;IP地址作为每一个网络设备的独特标识&#xff0c;其重要性不言而喻。特别是独享静态IP&#xff0c;它不仅为用户提供了更加稳定、安全的网络…

在虚机VirtualBox7.0.8安装Androidx86_64系统详细步骤要点

最近需要用到安卓系统蓝牙功能做测试&#xff0c;就选择了Virtualboxandroidx86方案&#xff0c;先把系统安装好&#xff0c;后面看是否可以比较好的完成蓝牙功能测试。如果可以的话&#xff0c;我会再发文分享下的&#xff0c;敬请期待。 1.准备材料 &#xff08;1&#xff…

[数据集][目标检测]交通灯检测数据集VOC+YOLO格式2600张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2600 标注数量(xml文件个数)&#xff1a;2600 标注数量(txt文件个数)&#xff1a;2600 标注…

食家巷传统面点积极响应中国品牌日,打造国货潮牌

2024 年中国品牌日活动以“中国品牌&#xff0c;世界共享&#xff1b;国货潮牌&#xff0c;品筑未来”为主题&#xff0c;旨在推动中国品牌的发展和国际化&#xff0c;展示国货潮牌的魅力和创新。食家巷传统面点品牌积极响应活动号召&#xff0c;以实际行动助力中国品牌的崛起。…

PyQt5编写的一个简易图像处理软件

文章目录 1. 简介2. 准备工作3. 主界面设计4. 功能构建5. 总结 1. 简介 通过编写简易图像处理软件&#xff0c;你可以学习如何使用 PyQt5 构建用户界面&#xff0c;以及如何与用户交互。同时&#xff0c;你还可以学习图像处理技术&#xff0c;如图像读取、傅里叶变换、滤波、增…

ThinkPad T480(20L5,20L6)原装出厂Win10系统镜像下载

lenovo联想ThinkPad系列 T480笔记本电脑20L5、20L6原厂OEM预装Windows10系统&#xff0c;恢复开箱状态一模一样&#xff0c;带有恢复重置功能 链接&#xff1a;https://pan.baidu.com/s/1NqqBKC_v2mPDs2qTxsYvxA?pwdeivm 提取码&#xff1a;eivm 原装出厂系统自带所有驱动…