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

链表K个节点的组内逆序调整问题

链表K个节点的组内逆序调整问题

作者:Grey

原文地址:

博客园:链表K个节点的组内逆序调整问题

CSDN:链表K个节点的组内逆序调整问题

题目描述

LeetCode 25. Reverse Nodes in k-Group

本题的 follow up 是:

Follow-up: Can you solve the problem in O(1) extra memory space?

即用 O ( 1 ) O(1) O(1)的空间复杂度实现整个算法。

主要思路

本题需要设计两个方法:

第一个方法

ListNode getKGroupEnd(ListNode start, int k)

该方法表示:从链表start位置开始,数够k个位置,返回k个位置后的那个节点。

比如链表为:

...-> start -> b -> c -> d -> e

假设:k = 3

则:表示从start开始,数够 3 个,所以返回c节点

如果是下述情况

...-> start -> b -> c -> null

假设:k = 6

由于start后面不够 6 个节点,所以返回null,完整代码如下:

public static ListNode getKGroupEnd(ListNode start, int k) {while (--k != 0 && start != null) {start = start.next;}return start;
}

第二个方法void reverse(ListNode start, ListNode end),表示反转startend之间的链表。

例如:原链表为:

....->a->b->c->d->e....

假设:start = a, end = d

经过reverse方法,会变成

...d->c->b->a->e.....

reverse方法也相对比较简单,就是链表反转的一种特殊情况,实现代码如下:

public static void reverse(ListNode start, ListNode end) {end = end.next;ListNode pre = null;ListNode cur = start;while (cur != end) {ListNode tmp = cur.next;cur.next = pre;pre = cur;cur = tmp;}start.next = end;
}

有了上述两个方法,我们可以比较方便实现原题要求,主流程如下

public static ListNode reverseKGroup(ListNode head, int k) {ListNode start = head;ListNode end = getKGroupEnd(start, k);if (end == null) {return head;}// 第一组凑齐了!head = end;reverse(start, end);// 上一组的结尾节点ListNode lastEnd = start;while (lastEnd.next != null) {start = lastEnd.next;end = getKGroupEnd(start, k);if (end == null) {return head;}reverse(start, end);lastEnd.next = end;lastEnd = start;}return head;
}

整个过程时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1)

更多

算法和数据结构学习笔记

算法和数据结构学习代码

参考资料

算法和数据结构体系班-左程云

相关文章:

  • VUE留言板
  • ESP32-Web-Server编程-HTML 基础
  • 新型信息基础设施下的IP追溯技术:构建数字化安全新境界
  • Linux sed 正则表达式的分组查找和替换
  • hive 偏门函数
  • 【人工智能】Chatgpt的训练原理
  • 10.30 作业 C++
  • 初始React
  • 亚马逊云科技:探索未来云计算之窗
  • 【WebSocket】通信协议基于 node 的简单实践和心跳机制和断线重连的实现
  • 【0241】Parser解析分析统计信息(PARSE ANALYSIS STATISTICS)
  • 中职组网络安全-linux渗透测试-Server2203(环境+解析)
  • Yolov8实现瓶盖正反面检测
  • Isaac Sim:使用 Replicator Composer 生成合成数据
  • 技术经济与企业管理 救命稻草
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • github指令
  • HashMap剖析之内部结构
  • Intervention/image 图片处理扩展包的安装和使用
  • java概述
  • leetcode-27. Remove Element
  • Netty 4.1 源代码学习:线程模型
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SpringCloud集成分布式事务LCN (一)
  • Twitter赢在开放,三年创造奇迹
  • TypeScript实现数据结构(一)栈,队列,链表
  • Webpack 4x 之路 ( 四 )
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 入门级的git使用指北
  • 网络应用优化——时延与带宽
  • 原生 js 实现移动端 Touch 滑动反弹
  • 找一份好的前端工作,起点很重要
  • python最赚钱的4个方向,你最心动的是哪个?
  • Semaphore
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (+4)2.2UML建模图
  • (11)MATLAB PCA+SVM 人脸识别
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (ros//EnvironmentVariables)ros环境变量
  • (八十八)VFL语言初步 - 实现布局
  • (六)激光线扫描-三维重建
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) Face-Resources
  • (转)Mysql的优化设置
  • (转)Sql Server 保留几位小数的两种做法
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 7 上传文件踩坑
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler