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

news2024/11/24 8:34:55

文章目录

  • 前言
  • 链表反转|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 next
            ListNode 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.coloradmin.cn/o/841677.html

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

相关文章

毕业后想往开发上位机的方向发展,不知道怎么样?

上位机的薪资目前还可以&#xff0c;虽然不能比肩互联网&#xff0c;但是在所有行业中应该还算比较高的&#xff0c;二十几万的年薪比较容易。 还不错&#xff0c;最流行的开发方式有labview和C#&#xff0c;建议选C#。工控主要还是集中在长三角和珠三角&#xff0c;搞上位机很…

CentOS 安装 Jenkins

本文目录 1. 安装 JDK2. 获取 Jenkins 安装包3. 将安装包上传到服务器4. 修改 Jenkins 配置5. 启动 Jenkins6. 打开浏览器访问7. 获取并输入 admin 账户密码8. 跳过插件安装9. 添加管理员账户 1. 安装 JDK Jenkins 需要依赖 JDK&#xff0c;所以先安装 JDK1.8。输入以下命令&a…

为什么亚马逊购物车会丢失呢?如何找回来呢?

想要找回店铺购物车&#xff0c;必须先清楚购物车丢失的原因&#xff0c;只有找到原因&#xff0c;对症下药&#xff0c;才能以最快的速度找回。 一、亚马逊购物车丢失的原因&#xff1a; 1.listing新上架 通常来说&#xff0c;新上架的Listing&#xff0c;该Listing在亚马逊…

HIVE优化之不需要参数优化

#1.数据倾斜 什么是数据倾斜&#xff1f; 一部分数据多 一部分数据少 造成的结果&#xff1a; MR运行过慢 主要是shuffle和reduce过程慢 分组聚合导致数据倾斜 Hive未优化的分组聚合 方法1&#xff1a;在MAP端直接聚合&#xff08;分组聚合优化&#xff09;&#xff0c;减少…

wxwidgets Ribbon使用wxRibbonToolBar实例

wxRibbonToolBar就是工具栏&#xff0c;一下是实现的效果&#xff0c;界面只是功能展示&#xff0c;没有美化 实现代码如下所示&#xff1a; MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800, 600)) …

超越传统线程:探索Java Loom协程(纤程/虚拟线程)的无限潜力

《超越传统线程&#xff1a;探索Java Loom协程(纤程/虚拟线程)的无限潜力》 一、Java协程的发展历程 Java协程的发展历程可以概括为以下几个阶段&#xff1a; 1963年&#xff0c;协程的概念被正式提出&#xff0c;它的诞生甚至早于线程。2007年&#xff0c;Kilim项目发布&…

【C++】map和set在OJ中的应用

文章目录 前言1. 剑指 Offer &#xff1a; 复杂链表&#xff08;带随机指针&#xff09;的复制1.1 思路分析&#xff08;利用map搞&#xff09;1.2 AC代码 2. 前K个高频单词2.1 思路1AC代码2.2 思路2AC代码2.3 思路3AC代码 3. 两个数组的交集3.1 思路分析3.2 AC代码 前言 上一篇…

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT&#xff1a;人工智能的奇迹 引言什么是人工智能&#xff1f;ChatGPT&#xff1a;AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一项令人兴奋的…

收集到大量的名片怎么转为excel?

来百度APP畅享高清图片 参加完展会或集体会议&#xff0c;是不是收了一大堆名片&#xff0c;保管起来超级麻烦&#xff0c;还容易丢三落四&#xff1f;别急&#xff0c;我们有办法&#xff01;把名片转成电子版保存到电脑上就完美啦&#xff01;但要是名片数量有点多&#xff0…

Linux文本三剑客之awk

目录 前言 awk 1.认识awk 2.使用awk 2.1语法 2.2常用命令选项 2.3awk变量 2.3.1内置变量 2.3.2自定义变量 2.4printf命令 awk例题 前言 awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是…

什么是全局代理,手机怎么设置全局代理

目录 什么是全局代理 全局代理的优缺点 优点 缺点 手机怎么设置全局代理 注意事项 总结 在计算机网络和信息安全中&#xff0c;全局代理是一种常用的技术手段&#xff0c;用于将网络流量通过代理服务器进行转发和处理。本文将介绍什么是全局代理&#xff0c;探讨全局代理…

Stable Diffusion - Candy Land (糖果世界) LoRA 提示词配置与效果展示

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132145248 糖果世界 (Candy Land) 是一个充满甜蜜和奇幻的地方&#xff0c;由各种各样的糖果和巧克力构成。在糖果世界&#xff0c;可以看到&…

el-select 三级联动

一、效果图 二、思路&#xff1a;先请求一级select数据&#xff0c;通过选中的id请求二级数据&#xff0c;以此类推&#xff01; 三、代码 <template><div><el-card><el-form :inline"true"><el-form-item label"一级">&l…

如何用正确的姿势监听Android屏幕旋转

作者&#xff1a;37手游移动客户端团队 背景 关于个人&#xff0c;前段时间由于业务太忙&#xff0c;所以一直没有来得及思考并且沉淀点东西&#xff1b;同时组内一个个都在业务上能有自己的思考和总结&#xff0c;在这样的氛围下&#xff0c;不由自主的驱使周末开始写点东西&…

安卓:UDP通信

目录 一、介绍 网络通信的三要素&#xff1a; &#xff08;1&#xff09;、IP地址&#xff1a; IPv4: IPv6: IP地址形式&#xff1a; IP常用命令&#xff1a; IP地址操作类: &#xff08;2&#xff09;、端口&#xff1a; &#xff08;3&#xff09;、协议: UDP协…

【图论】单源最短路

算法提高课笔记。&#xff08;本篇还未更新完… 目录 单源最短路的建图方式例题热浪题意思路代码 信使题意思路代码 香甜的黄油题意思路代码 最小花费题意思路代码 最优乘车题意思路代码 昂贵的聘礼题意思路代码 单源最短路的建图方式 最短路问题可以分为以下两类&#xff1a…

红队钓鱼技术之LNK快捷方式

简介 lnk文件是用于指向其他文件的一种文件。这些文件通常称为快捷方式文件&#xff0c;通常它以快捷方式放在硬盘上&#xff0c;以方便使用者快速的调用。lnk钓鱼主要将图标伪装成正常图标&#xff0c;但是目标会执行shell命令 步骤 1.编写shell命令 首先新建一个文本文件t…

解码大众全新数字高尔夫8汽车CAN FD行驶功能电气架构

据在大众原厂的伙伴介绍&#xff0c;全新数字高尔夫8将在11月上市销售&#xff0c;目前高尔夫8在行驶功能电气架构上采用的CAN FD&#xff0c;在多媒体这一块采用的以太网&#xff0c;后续估计大部分类似同样MQBEvo平台的车型均会复制升级过来&#xff0c;那么&#xff0c;未来…

An unexpected error has occurred. Conda has prepared the above report

今日在服务器上创建anaconda虚拟环境的时候&#xff0c;出现了如下报错 An unexpected error has occurred. Conda has prepared the above report 直接上解决方案 在终端中输入如下指令 conda config --show-sources 如果出现以下提示&#xff0c;说明多了一个文件 输入以下…

基于CentOS 7构建LVS-DR集群

DIPVIPRIPClient192.169.41.139 LVS 192.168.41.134192.169.41.10RS1192.168.41.135RS2192.168.41.138 要求&#xff1a; node4为客户端&#xff0c;node2为LVS&#xff0c;node3和node4为RS。 1.配置DNS解析&#xff08;我这里使用本地解析&#xff09; 192.168.41.134 www.y…