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

news2024/11/20 14:17:01

基础知识要求:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 8.0 迁移到kingbase v8r6 不兼容之处记录

本文以kingbase 为解释主体 一. 函数 1.无 sysdate()&#xff0c;可以使用 current_timestamp() 替换 SELECT CURRENT_TIMESTAMP() 2.计算前几天 &#xff0c; 不能 执行 now() interval -1 day&#xff0c;可以使用 date_sub( n, unit) 替换 -- 前三天 SELECT DATE_SUB…

6款日常精选手机APP推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.全能相机软件——无他相机 无他相机App是一款完全免费且功能全面的美颜相机软件。这款相机应用集自拍、美颜、图片编辑、风格化模板、流行贴…

sql实践

1.从excel导入数据 在excel导入数据时要先在数据库中创建对应的数据库表 CREATE TABLE your_table_name (crawl_datetime DATE,url CHAR(255),company_name CHAR(255),company_size CHAR(255),company_type CHAR(255),job_type CHAR(255),job_name CHAR(255),edu CHAR(255),e…

tomcat--安装

官网&#xff1a;Apache Tomcat - Welcome! 官网文档&#xff1a;Apache Tomcat 8 (8.5.100) - Documentation Index 帮助文档&#xff1a;Apache Tomcat Home - Apache Tomcat - Apache Software Foundation FAQ - Apache Tomcat - Apache Software Foundation yum安装 查…

Lumina-T2X 一个使用 DiT 架构的内容生成模型,可通过文本生成图像、视频、多视角 3D 对象和音频剪辑。

Lumina-T2X 是一个新的内容生成系列模型&#xff0c;统一使用 DiT 架构。通过文本生成图像、视频、多视角 3D 对象和音频剪辑。 可以在大幅提高生成质量的前提下大幅减少训练成本&#xff0c;而且同一个架构支持不同的内容生成。图像质量相当不错。 由 50 亿参数的 Flag-DiT …

Online RL + IL : TGRL: An Algorithm for Teacher Guided Reinforcement Learning

ICML 2023 Poster paper Intro 文章设定一个专家策略&#xff0c;给出两种优化目标。一个是基于专家策略正则的累计回报&#xff0c;一个是原始累计回报。通过比较二者动态的衡量专家策略对智能体在线学习的影响程度&#xff0c;进而实现在线引导过程。 Method 原始的RL目标…

【LangChain系列 15】语言模型——LLMs(一)

原文地址&#xff1a;【LangChain系列 15】语言模型——LLMs(一) 本文速读&#xff1a; 异步API 自定义LLM Fake LLM HumanInput LLM 本文将介绍LLMs在LangChain中的一些用法&#xff0c;帮助我们更好地了解LLM模块。 01 异步API LangChain通过异步库实现了对异步的支持&a…

创意无限!AI一键生成漫画视频,每天轻松收入300+,粘贴复制简单操作!

AI项目算是2023到2024一直都非常火爆的项目&#xff0c;这次的AI漫画项目也是相当暴利的项目了&#xff0c;我知道一个老铁通过AI漫画半年已经获利100W了&#xff0c;真的是相当暴利了。 不再多说&#xff0c;直接上手拆解项目。 项目获取&#xff1a; https://zzmbk.com/htt…

Springboot+MybatisPlus如何实现分页和模糊查询

实现分页查询的时候我们需要创建一个config配置类 1、创建MybatisPlusConfig类 Configuration //表明这是一个配置类 ConditionalOnClass(Value{PaginationInterceptor.class} //ConditionalOnClass:当指定的类存在时&#xff0c;才会创建对应的Bean // 这里当PaginationInt…

解决springboot+vue静态资源刷新后无法访问的问题

一、背景 原项目是有前后端分离设计&#xff0c;测试环境是centos系统&#xff0c;采用nginx代理和转发&#xff0c;项目正常运行。 项目近期上线到正式环境&#xff0c;结果更换了系统环境&#xff0c;需要放到一台windows系统中&#xff0c;前后端打成一个jar包&#xff0c;…

最高可得 300 元现金!分享实操经验,即可轻松获得奖励

OpenBayes贝式计算平台第二期「创作者激励计划」上线啦&#xff0c;快来和 HyperAI超神经一起参加吧&#xff01; 无论你是深度学习、数据科学或大模型的资深玩家&#xff0c;还是刚入门技术小白&#xff1b; 无论你是拥有丰富创作经验的老手&#xff0c;还是刚踏入社交媒体世…

(2024,MambaOut,Mamba 适合长序列,区分指标,不适合分类,适合检测和分割)视觉真的需要 Mamba 吗?

MambaOut: Do We Really Need Mamba for Vision? 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 3. 概念讨论 3.1 Mamba 适合哪些任务&#xff1f; 3.2 视觉识别任…

【小笔记】streamlit使用笔记

【小笔记】streamlit使用笔记 1.streamlit是什么&#xff0c;为什么要用它&#xff1f; 一句话&#xff0c;这个东西是一个python的可视化库&#xff0c;当你想要给你的程序添加个web界面&#xff0c;而又不会或不想用前端技术时&#xff0c;你就可以考虑用它。 类似的可视化库…

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮

近日、全球知名科技公司惠普在北京隆重举办了以“用智能&#xff0c;开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会&#xff0c;此次盛会标志着惠普在人工智能领域迈出了重要一步&#xff0c;惠普紧跟时代步伐&#xff0c;推出了更高效、更安全、更灵活的AI PC产…

redis报错500

之前自己举一反三把value也给序列化了&#xff1a; 然后报错了&#xff1a; 原因是这里传入的是Integer类型&#xff0c;序列化的话就变为string类型了

web入门练手案例(一)

下面是一下web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 新闻页面 案例描述&#xff1a; 互联网的发展使信息的传递变得方便、快捷&#xff0c;浏览新闻称为用户获取信息的重要渠道。下面将实现一个简…

云服务器和主机的区别

在今天的数字化时代&#xff0c;对于个人和企业来说&#xff0c;选择适当的服务器托管解决方案至关重要。然而&#xff0c;很多人对于云服务器和传统主机之间的区别不太清楚。本文将为您提供一个详细的指南&#xff0c;帮助您理解云服务器与主机之间的区别&#xff0c;以便您能…

Chatgpt教你使用Python开发iPhone风格计算器

上次使用Chatgpt写爬虫&#xff0c;虽然写出来的代码很多需要修改后才能运行&#xff0c;但Chatgpt提供的思路和框架都是没问题。 这次让Chatgpt写一写GUI程序&#xff0c;也就是你常看到的桌面图形程序。 由于第一次测试&#xff0c;就来个简单点的&#xff0c;用Python写用…

Linux防火墙iptalbes

1 iptalbes 1.1 概念 防火墙(Firewall)是一种隔离技术&#xff0c;用于安全管理与筛选的软件和硬件设备&#xff0c;使计算机内网和外网分开&#xff0c;可以防止外部网络用户以非法手段通过外部网络进入内部网络&#xff0c;保护内网免受外部非法用户的侵入。 1.2 SELinux …

【瑞萨RA6M3】2. UART 实验

https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…