当前位置: 首页 > news >正文

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

相关文章:

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

基础知识要求&#xff1a; Java&#xff1a;方法、while循环、for循环、if else语句 Python&#xff1a; 方法、while循环、for循环、if else语句 题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个…...

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

&#x1f496; Brief&#xff1a;大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 个人说明书&#xff1a;Zeeland&…...

[240514] OpenAI 发布 GPT-4o,人机交互的历史性时刻 | 苹果芯片进军服务器剑指AI​ | 谷歌大会以AI为主

目录 OpenAI 发布 GPT-4o&#xff0c;人机交互的历史时刻苹果芯片进军服务器&#xff0c;剑指生成式 AI2024年谷歌开发者大会将围绕 AI 展开 OpenAI 发布 GPT-4o&#xff0c;人机交互的历史时刻 OpenAI 发布了 GPT-4o&#xff0c;大家一直都想要现在终于等到的语音助手 : 勿需…...

Maximo 在 Automation Script 中访问数据库

在 Automation Script 中我们通常使用 mbo 对象来操作数据&#xff0c;但有时候当数据量较大时&#xff0c;使用 mbo 对象来操作数据会比较慢。这时候&#xff0c;我们可以使用 JDBC 的方式来直接访问数据库&#xff0c;从而提高操作数据的效率。 下面看看使用 JavaScript 脚本…...

gitee 简易使用 上传文件

Wiki - Gitee.com 官方教程 1.gitee 注册帐号 (直接选择初始化选项即可&#xff0c;无需下载git&#xff09; 2.下载git 安装 http://git-scm.com/downloads 3. 桌面 鼠标右键 或是开始菜单 open git bash here 输入&#xff08;复制 &#xff0c;粘贴&#xff09; 运行…...

iOS Xcode 升级Xcode15报错: SDK does not contain ‘libarclite

一 iOS Xcode 升级Xcode15报错: SDK does not contain libarclite 1.1 报错信息 SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/ lib/arc/libarclite_iphonesimulator.a; try increasin…...

即插即用篇 | YOLOv8引入轴向注意力 Axial Attention | 多维变换器中的轴向注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…...

【芯片制造】【常用术语】CP、FT、WAT

背景&#xff1a; 在我们讲wafer加工好以后&#xff0c;需要进行相关测试&#xff0c;在此阶段&#xff0c;有很多提及到的常用术语&#xff0c;我们依次进行解释。主要单词含义&#xff1a; CP &#xff1a; Chip Probing&#xff08;probe card&#xff09;&#xff0c;wafer…...

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”&#xff0c;这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。小编将…...

超级简单的地图操作工具开发可疑应急,地图画点,画线,画区域,获取地图经纬度等

使用echars的地图画点,画线,画区域,获取地图经纬度等 解压密码:10086007 地图也是用临时的bmap.js和china.js纯离线二选一 一共就这么多文件 画点,画线,画区域 点击地图获取经纬度-打印到控制台,这样就能渲染航迹,多变形,结合其他算法算圆等等操作 下载资源:https://download…...

25_NumPy数组np.round将ndarray舍入为偶数

25_NumPy数组np.round将ndarray舍入为偶数 使用 np.round() 将 NumPy 数组 ndarray 的元素值舍入为任意位数。请注意&#xff0c;0.5 由于舍入到偶数而不是一般舍入而舍入为 0.0。 本文介绍了一般舍入的实现示例。 如何使用 np.round() 基本用法指定要舍入的位数&#xff1a…...

Java字符串去除空格的方法

前言 在Java编程实践中&#xff0c;处理字符串中的空格是一项基本且频繁的操作。本文将深入探讨如何使用Java原生方法以及Apache Commons Lang库中的StringUtils类&#xff0c;全方位解决字符串去空格的需求&#xff0c;让你的代码更加健壮和高效。 1. Java原生方法 a. trim…...

【Python】【应用】Python应用之如何操作WiFi之一——使用pywifi

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Python应用&…...

2024OD机试卷-分割均衡字符串 (java\python\c++)

题目:分割均衡字符串 题目描述 均衡串定义: 字符串 中只包含两种字符,且这两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定:字符串中只包含大写的 X 和 Y 两种字符。 输入描述 字符串的长度:[2, 10000]。 给定的字符串均为均…...

完整版解答!2024年数维杯数学建模挑战赛B题

B题 生物质和煤共热解问题的研究 技术文档第一问1.1问题一分析1.2数据预处理1.3问题一Spearman相关性分析 数据代码资料获取 技术文档 第一问 1.1问题一分析 对于问题一&#xff0c;题目要求分析出正己烷不溶物对焦油产率、水产率、焦渣产率这三个指标是否有显著影响&#x…...

Android开发,日志级别

5个日志级别 Verbose (VERBOSE): 这是最低的日志级别&#xff0c;用于输出最为详尽的信息&#xff0c;包括开发和调试过程中的各种细节。在Log类中对应的方法是Log.v()。Debug (DEBUG): 此级别用于输出调试信息&#xff0c;帮助开发者理解程序运行流程或状态。通过Log.d()方法…...

Docker 部署 MySQL 数据库

文章目录 MySQL 镜像创建缩主机目录my.cnf 配置文件docker-compose.yml给 Test 账号添加权限 Docker 与 docker-compose 安装这里不做介绍。 MySQL 镜像 根据需要选择版本 # 5.7 版本 docker pull mysql:5.7 # 8.2 版本 docker pull mysql:8.2创建缩主机目录 cd home # 创建…...

代码技巧: 类中同一个函数可以同时存在常函数版本和普通函数版本(c++)

在类中如果我们希望在常函数中修改某属性的值可以使用mutable来实现。 如果有下面的场景&#xff0c;假设我们有一个函数hobby()需要在非const的对象调用的时候&#xff0c;应该去修改内部的属性&#xff0c;在const修饰的对象调用的时候可以满足不修改内部的属性。 鉴于上面的…...

2024OD机试卷-转盘寿司 (java\python\c++)

题目:转盘寿司 题目描述 寿司店周年庆,正在举办 优惠活动 回馈新老客户。 寿司转盘上总共有 n 盘寿司,prices[i] 是第 i 盘寿司的价格, 如果客户选择了第 i 盘寿司,寿司店免费赠送客户距离第 i 盘寿司最近的下一盘寿司 j,前提是 prices[j] < prices[i],如果没有满足…...

MongoDB创建或删除用户并验证数据库权限

本文假设在Ubuntu中安装了MongoDB&#xff0c;并用命令行工具mongosh演示。 一、创建用户并设置数据库权限 用户和数据库是关联的&#xff0c;要在登录时验证某个数据库&#xff0c;需要在相应的数据库内创建用户&#xff0c;即先切换到该数据库再创建用户。除非是root最高权…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...