算法通过村第二关-链表黄金笔记|K个一组反转

文章目录

  • 前言
  • 链表反转|K个一组翻转链表
  • 解题方法:
    • 头插法处理:
    • 穿针引线法处理:
  • 总结


前言

提示:没有人天生就喜欢一种气味而讨厌另一种气味。文明的暗示而已。


链表反转|K个一组翻转链表

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

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

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

在这里插入图片描述
进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

思路来的很快,重点是代码层面的编写,这个很重要,思路呢?就是常见的头插法和穿针引线法来处理数组反转问题,当然今天我们也是采用这两种方法解决的,那就开始实现他吧😃

解题方法:

头插法处理:

头插法重点在理解虚拟节点上,如果这个问题解决了,相比较而言要比穿针引线要好实现的多😄, 我们试着把链表整体分为3段,一段是已经翻转的,一端是正在反转,一端是未反转的。为了方便翻转,我们需要京链表遍历一边,统计一下链表的长度len,然后将链表进行分组n=len/k,接下来就是循环进行分组翻转链表。 我们尝试这画一些图,能够更有里的说明:
在这里插入图片描述
结假设我们开始翻转 4 节点:
在这里插入图片描述
具体思路:

  1. 找到链表的长度 len 分组
  2. cur.next = cur.next.next; next.next = pre.next; pre.next = next;
  3. 循环下一次

上代码😄

	/*** 方法2:头插法** @param head* @param k* @return*/public static ListNode reverseKGroup2(ListNode head, int k) {ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode cur = head;int len = 0;while (cur != null) {cur = cur.next;len++;}int n = len / k; // 计算出来分几组ListNode pre = dummyNode;cur = head;for(int i = 0; i < n; i++) {for(int j = 0; j < k - 1; j++) {  // ? k - 1  画图就知道了ListNode next = cur.next;cur.next = cur.next.next;next.next = pre.next;pre.next = next;}pre = cur;  cur = cur.next;   // 记得修改指针}return dummyNode.next;}

穿针引线法处理:

这个思路可以回顾一下穿针引线,到底是怎么回事🤣

首先还是将链表分组翻转, 我们就可以一组一组的处理,把他们分成已经翻转的、正在翻转的和未翻转的三部分,同时为了方便处理头节点,我们使用了一个虚拟的节点。

接下来就是遍历,根据k个为一组找到四个关键位置,并使用变量per,start,end,next标记,比如下面的图:
在这里插入图片描述
接着我们就开始翻转,对应颜色进行翻转,我们将end.next = null ,直接使用链表翻转,复用链表翻转的常规操作。🤖注意指针的变化,head便是传入方法的参数,我们接着看图:
在这里插入图片描述

当然翻转之后,我们接下来就是将原始链表缝起来,这就需要调整指针域,同样这里也要注意指针的变化🤖
在这里插入图片描述
接着调整指针进行下一次循环:
在这里插入图片描述
总结一下📝

  1. 遍历找到四个关键位置,复用常规翻转链表
  2. pre.next = end; start.next = next; 调整指针域
  3. 调整下一次循环

了解上面的图,代码应该也会写吧🥰

 /*** 方法1: 穿针引线法** @param head* @param k* @return*/public static ListNode reverseKGroup(ListNode head, int k) {ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode pre = dummyNode;ListNode end = dummyNode;while (end.next != null) { // 最终结束的地方for (int i = 0; i < k && end != null; i++) {end = end.next; // 找到当前分组的最后一个}if (end == null) {break;}// 找到start nextListNode start = pre.next;ListNode next = end.next;end.next = null; // 思考?pre.next = reverse(start);start.next = next;pre = end;// 调整下一次循环end = pre;}return dummyNode.next;}

复习一下链表反转💕:

private static ListNode reverse(ListNode head) {ListNode pre = null;ListNode cur = head;while(cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}

总结

注意:指针域的变化,多画图更容易理解,链表反转重点,重点,重点!!!

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

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

相关文章

【css】textarea-通过resize:none 禁止拖动设置大小

使用 resize 属性可防止调整 textareas 的大小&#xff08;禁用右下角的“抓取器”&#xff09;&#xff1a; 没有设置resize:none 代码&#xff1a; <!DOCTYPE html> <html> <head> <style> textarea {width: 100%;height: 150px;padding: 12px 20p…

源码分析——HashMap(JDK1.8)源码+底层数据结构分析

文章目录 HashMap 简介底层数据结构分析JDK1.8之前JDK1.8之后 HashMap源码分析构造方法put方法get方法resize方法 HashMap常用方法测试 HashMap 简介 HashMap 主要用来存放键值对&#xff0c;它基于哈希表的Map接口实现&#xff0c;是常用的Java集合之一。 JDK1.8 之前 HashM…

HBase-写流程

写流程顺序正如API编写顺序&#xff0c;首先创建HBase的重量级连接 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;…

python实现简单的爬虫功能

前言 Python是一种广泛应用于爬虫的高级编程语言&#xff0c;它提供了许多强大的库和框架&#xff0c;可以轻松地创建自己的爬虫程序。在本文中&#xff0c;我们将介绍如何使用Python实现简单的爬虫功能&#xff0c;并提供相关的代码实例。 如何实现简单的爬虫 1. 导入必要的…

1、如何实现两台电脑之间数据相互读写

一、确保两台电脑在同一个局域网中&#xff0c;可以使用网线【动态配置】进行两台电脑互连。 二、静态配置: 将IP地址和网关设为192.168.0.1&#xff0c;目的是让这台电脑做另一台电脑的网关&#xff0c;子网掩码一点击会自动添加。第二台电脑同样打开设置&#xff0c;此处IP地…

DT昆虫绑定学习(没蒙皮)

SelectEdgeLoopSp; ConvertSelectionToVertices;selectType -ocm -alc false; selectType -ocm -polymeshVertex true; CreateCluster; 连接到物体 global proc matchTrns() { string $mtr[] ls -sl; if (size($mtr) < 2){ warning "MUST select 2 objects!"…

SQL分类及通用语法数据类型(超详细版)

一、SQL分类 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写。它是一种用于管理和操作关系型数据库系统的标准化语言。SQL分类如下&#xff1a; DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML:…

Docker学习(二十四)报错速查手册

目录 一、This error may indicate that the docker daemon is not running 报错docker login 报错截图&#xff1a;原因分析&#xff1a;解决方案&#xff1a; 二、Get "https://harbor.xxx.cn/v2/": EOF 报错docker login 报错截图&#xff1a;原因分析&#xff1a…

DARPA TC-engagement5数据集解析为json格式输出到本地

关于这个数据集的一些基本信息就不赘述了&#xff0c;参考我之前的博客。DARPA TC-engagement5数据集官方工具可视化 官方给的工具是将解析的数据存到elasticsearch的&#xff0c;但是数据集的解压增长率非常恐怖&#xff0c;对空间要求很高。因此针对这个问题&#xff0c;我对…

安全防御(3)

1.总结当堂NAT与双机热备原理&#xff0c;形成思维导图 2.完成课堂nat与双机热备试验 引用IDS是指入侵检测系统&#xff0c;它可以在网络中检测和防御入侵行为。IDS的签名是指根据已知入侵行为的特征制定的规则&#xff0c;用于检测和警告可能存在的入侵行为。签名过滤器可以根…

计算机网络 ARP协议 IP地址简述

ARP只能在一个链路或一段网络上使用

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包&#xff0c;当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…

LVS—DR集群的搭建

目录 lvs-dr模式工作原理&#xff1a; 搭建结构&#xff1a; 1、RS&#xff1a; 1&#xff09;两台RS准备好httpd环境和测试文件 2&#xff09;添加虚拟IP&#xff08;vip&#xff09;、添加访问本地vip的静态路由 并抑制ARP 2、DS&#xff1a; 1&#xff09;安装ipvasadm…

【C++】C++回调函数基本用法(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

CommStudio for .NET Crack

CommStudio for .NET Crack CommStudio for.NET使您的应用程序可以轻松地使用串行端口和调制解调器进行通信。CommStudio for.NET是一套全面的组件和可视化调试工具&#xff0c;可将远程系统和设备与visual Studio 2005和visual Studio 2008集成。开发与遗留系统和外部设备集成…

成集云 | 畅捷通采购单同步至钉钉 | 解决方案

源系统成集云目标系统 介绍 畅捷通是一家专业的金融科技公司&#xff0c;致力于为投资者提供便捷、高效的金融服务。通过畅捷通T的交易方式&#xff0c;投资者可以更加灵活地进行买卖交易&#xff0c;并且在交易完成后即可获得结算款项&#xff0c;无需等待T1的结算周期。 钉…

【solon生态】- solon.cloud.micrometer插件使用指南及micrometer详解

solon.cloud.micrometer插件使用指南 solon是什么solon的cloud生态图快速入门 micrometer指南micrometer是什么监控系统 Supported Monitoring Systems注册表 Registry度量 Meters度量名 Naming Meters度量标签 Tag Naming通用标签 Common Tags 指标过滤器 MeterFilter聚合速率…

农业大数据可视化平台,让农业数据更直观展现!

农业大数据可视化平台是指利用大数据技术和可视化工具&#xff0c;对农业领域的数据进行收集、整理、分析和展示的平台。它可以帮助农业从业者更好地理解和利用农业数据&#xff0c;提高农业生产效率和决策水平。 农业大数据可视化平台通常具有以下特点和功能&#xff1a; 数据…

【JAVA】七大排序算法(图解)

稳定性&#xff1a; 待排序的序列中若存在值相同的元素&#xff0c;经过排序之后&#xff0c;相等元素的先后顺序不发生改变&#xff0c;称为排序的稳定性。 思维导图&#xff1a; &#xff08;排序名称后面蓝色字体为时间复杂度和稳定性&#xff09; 1.直接插入排序 核心思…

中通快递:短期财务前景良好,长期财务业绩将遭受严重打击

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 华尔街分析师对中通快递的短期财务前景预测 华尔街分析师目前预测中通快递&#xff08;ZTO&#xff09;将在2023财年全年产生一份相当不错的财务业绩。 根据S&P Capital IQ的数据&#xff0c;在过去的6个月里&#xff…