代码随想录算法训练营第四天| 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II

news2025/1/25 4:58:00

代码随想录算法训练营第四天| 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II

24. 两两交换链表中的节点

用虚拟头结点,这样会方便很多。

本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。

题目链接/文章讲解/视频讲解:
在这里插入图片描述

看到题目的第一想法:

设置两个节点pre,和cur,初始时均置于虚拟头节点。然后就是移动pre和cur,自己手动画图,看如何才能进行两个节点之间的翻转了。
在这里插入图片描述
之后记得把cur节点置于pre处。

package com.second.day4;

public class SwapPairs_24 {
    public ListNode swapPairs(ListNode head) {
        if(head == null)
            return null;
        ListNode preHead = new ListNode(0); //虚拟头节点
        preHead.next = head;
        ListNode pre = preHead;
        ListNode cur = preHead;
        while(cur.next != null && cur.next.next != null) {
            ListNode temp1 = pre; //暂存pre节点
            pre = cur.next;     //pre和cur均往后移动一位
            cur = cur.next.next;
            ListNode temp2 = cur.next; //暂存cur的下一位
            //交换pre和cur指向的节点
            temp1.next = cur;
            cur.next = pre;
            pre.next = temp2;
            //交换后将cur指向pre
            cur = pre;
        }
        return preHead.next;
    }

    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        SwapPairs_24 demo = new SwapPairs_24();
        demo.swapPairs(node1);
    }
}

看完代码随想录之后的想法:

思路是一样的,嘻嘻。

自己实现过程中遇到哪些困难:

一定要画图,不然很容易搞不清楚,之后稍微debug后过的。

19.删除链表的倒数第N个节点

双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。

题目链接/文章讲解/视频讲解
在这里插入图片描述

看到题目的第一想法:

1.先遍历一遍链表,求出其长度
2.算出链表删除的第几个节点
3.删除节点

package com.second.day4;

public class RemoveNthFromEnd_19 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //先遍历一遍链表,求出其长度
        ListNode cur = head;
        int length = 0;
        while(cur != null) {
            length += 1;
            cur = cur.next;
        }
        ListNode preHead = new ListNode(0);
        preHead.next = head;
        ListNode pre = preHead;
        cur = head;
        //算出链表删除的第几个节点
        length -= n;
        while(length > 0) {
            pre = cur;
            cur = cur.next;
            length -= 1;
        }
        //删除cur节点
        pre.next = cur.next;
        return preHead.next;
    }
}

看完代码随想录之后的想法:

卡哥的思路比我好,设置快慢指针,快指针先走n+1步,然后slow和fast指针再一起走,直到fast指针为空,删除slow后面那个节点。
为什么要fast先走n+1,而不是n呢?因为fast多走一步,结束循环时,slow指针指向删除节点的前一个节点。
比我的想法妙多了。

自己实现过程中遇到哪些困难:

无,嘻嘻。

面试题 02.07. 链表相交

本题没有视频讲解,大家注意 数值相同,不代表指针相同。

题目链接/文章讲解:
在这里插入图片描述

看到题目的第一想法:

1.遍历链表a,求其长度
2.遍历链表b,求其长度
3.求其长度差值diff
5.先让长链表先走diff
6.然后同时走,遇到相遇点。

package com.second.day4;

public class GetIntersectionNode_0207 {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null)
            return null;
        //遍历链表a,求其长度
        int length_A = 0;
        ListNode curA = headA;
        while(curA != null) {
            length_A += 1;
            curA = curA.next;
        }
        //遍历链表b,求其长度
        int length_B = 0;
        ListNode curB = headB;
        while(curB != null) {
            length_B += 1;
            curB = curB.next;
        }
        int diff = Math.abs(length_A - length_B);
        return length_A - length_B > 0 ? IntersectionNode(headA, headB, diff) : IntersectionNode(headB, headA, diff);
    }

    public ListNode IntersectionNode(ListNode headA, ListNode headB, int diff) {
        ListNode curA = headA;
        while(diff > 0) {
            curA = curA.next;
            diff -= 1;
        }
        ListNode curB = headB;
        while(curA != null && curB != null) {
            if(curA == curB)
                return curA;
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}

看完代码随想录之后的想法:

思路一样!!!nice!!!

自己实现过程中遇到哪些困难:

142. 环形链表 II

算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。
题目链接/文章讲解/视频讲解:
在这里插入图片描述

看到题目的第一想法:

看到这个题的时候只知道自己做过,在我看来,这个题更像是数学题,之后看了题解,没有第一次看题解那么难啦。
看完思想后直接AC

package com.second.day4;

public class DetectCycle_142 {
    public ListNode detectCycle(ListNode head) {
        ListNode preHead = new ListNode(0);
        preHead.next = head;
        //定义快慢指针
        ListNode fast = preHead;
        ListNode slow = preHead;
        while(fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            //当快慢指针相遇
            if(fast == slow) {
                //慢指针至于head
                slow = preHead;
                //slow指针和fast每次移动一位,相遇点即为环的入口
                while(slow != fast) {
                    slow = slow.next;
                    fast = fast.next;
                }
                return slow;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        ListNode node3 = new ListNode(3);
        ListNode node2 = new ListNode(2);
        ListNode node0 = new ListNode(0);
        ListNode node4 = new ListNode(-4);
        node3.next = node2;
        node2.next = node0;
        node0.next = node4;
        node4.next = node2;
        DetectCycle_142 demo = new DetectCycle_142();
        demo.detectCycle(node3);
    }
}

看完代码随想录之后的想法:

卡哥真的妙!!!

自己实现过程中遇到哪些困难:

还需努力!!!

今日收获,记录一下自己的学习时长:

今天写了四个题:
24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
代码:1.5h
博客:1h
不积跬步无以至千里,不积小流无以成江海。继续努力。

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

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

相关文章

MicroPython-On-ESP8266——8x8LED点阵模块(4)基于MAX7219滚动显示字符/图案

MicroPython-On-ESP8266——8x8LED点阵模块(4)基于MAX7219滚动显示字符/图案 1. 继续折腾点阵模块 咱们已经学习了点阵屏基础电路与驱动原理,并用74HC595和MAX7219都成功地驱动点阵屏显示了爱心图案。 MicroPython-On-ESP8266——8x8LED点…

python-(6-5-2)爬虫---处理cookie来获取书架数据

文章目录一 需求二 流程分析1 登录2 获取书架的数据三 完整代码一 需求 通过处理cookie来访问自己的书架资源。 二 流程分析 带着cookie,去请求url,得到书架内容。 要将上述的两个操作连续起来,可以使用session。 session是一连串的请求…

自动驾驶之多任务方法调研

1. YOLOP github C TRT TX2 我们提出了一种高效的多任务网络,该网络可以联合处理自动驾驶中的目标检测(车,没有红绿灯)、可驾驶区域分割和车道检测三个关键任务 速度: TX2上23FPS;TAITAN XP上41FPS. 自测结果: 灵活性: 支持…

RNN LSTM GRU

GRU是LSTM的简化结构,而LSTM是RNN的优化结构。 1.RNN RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息. 将网络的输出保存在一个记忆单元中,这个记忆单元的输出经过权重参数调整后和下一次的输入一起进入神经网络中…

队列之王: Disruptor 原理、架构、源码 一文穿透

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

MySQL innodb引擎架构分析-Redo log

文章目录系列文章目录前言一、Redo log是什么?二、Redo log是怎么工作的Redo log的组成Redo log的配置Redo log何时刷盘总结系列文章目录 1. MySQL innodb引擎架构分析-Buffer Pool 2. MySQL innodb引擎架构分析-Redo log 前言 在MySQL的事物处理过程中&#xff0c…

12 款 yyds 的 IDEA插件,配上18条使用技巧,绝了

工欲善其事,必先利其器。想要提升编程开发效率,必须选择一款顺手的开发工具。 JetBrains 公司提供了一系列功能强大、风格统一的开发工具,深受开发者喜爱。其中,IDEA 是面向 Java 开发的专业 IDE(集成开发环境&#x…

python os.system调用别的系统程序总出现一闪而过的黑框解决办法

python os.system调用别的系统程序总出现一闪而过的黑框解决办法 今天打包了py程序,运行的时候发现老是有个黑框一闪而过。经过多次尝试发现是os.system的问题,调用这个函数会调用cmd,所有会出现短暂的黑框显示。 解决办法1:换用…

HarmonyOS跨端迁移开发代码演示

目录说些废话开源代码环境代码ability_main.xmlconfig.jsonMainAbility.javaMainAbilitySlice.java测试说些废话 官方文档:跨端迁移开发指导(基于java开发)     下面环境里写的两台真机我测试的时候无法正常产生回迁效果,所以…

以太网 DHCP(DHCP的8种报文、DHCP配置、DHCP中继)

2.13.1 以太网 DHCP(DHCP的8种报文、DHCP配置、DHCP中继) DHCP-22.13.1 以太网 DHCP(DHCP的8种报文、DHCP配置、DHCP中继)一、DHCP的8种报文二、DHCP配置接口配置:全局配置:三、DHCP中继配置案例&#xff1…

游戏开发52课 渲染路径

4.6 渲染路径(Rendering Path) 4.6.1 经典顶点光(Legacy Vertex Lit) 严格来说,它也是前向渲染的一种,但有些引擎(如Unity)将它单独抽离出来。由于光照计算在顶点,所以…

微服务架构系列(一)之虚拟平台、分布式存储、高可用k8s集群环境搭建

一、物理机虚拟平台搭建 1、由实向需架构转换图(每台物理机要求两块硬盘用来做分布式存储和系统盘,我的是10年前的老机器没啥大的要求): 2、系统安装去官网下载 Proxmox VE 7.x ISO Installer (按需求选择版本&#x…

sublime text 4的安装/配置中文/更换配色方案

效果 安装 参考文章:Sublime Text v4.0(4143)安装方法 Sublime Text v4.0(4143)下载地址:https://www.sublimetext.com/download_thanks?targetwin-x64 安装软件找到软件安装位置,找到sublime_text.exe将sublime_text.exe 拖入16进制编辑…

[附源码]计算机毕业设计基于协同过滤的资讯推送平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

安卓玩机搞机技巧综合资源-----手机蝰蛇音效 杜比安装步骤 多种方式【九】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

编程小白想转行互联网,想以python为入口,究竟可不可行?

前言 最近有些朋友私信过我这个问题,很多编程小白想从事或转行互联网,想以Python为切入口,究竟可不可行? 以我看到的一些小伙伴的学习经历来说,虽说学会Python不能够马上胜任一些工作,但这可能是你离互联…

一例Trickbot家族js下载器的分析

样本信息 MD5: e36380d824811bc28fbc26ea84c1a868 SHA1: 19d5fc16cfabae3b3c26bbb4f5798da42733a2fa SHA256: 16429e95922c9521f7a40fa8f4c866444a060122448b243444dd2358a96a344c SHA512: 6c6f323893870536822a2aa2aebe783379906081fcf004dd04cb40cc1109c3452d39b548ac8b2a654…

安卓APP源码和设计报告——导航系统

演示答辩发言稿&#xff1a; 注意&#xff1a;1.在mainfest.xml文档中添加访问权限即一系列<uses-permission>元素使用Android中提供的权限。比如百度地图的使用联网的情况下需要网络功能权限。 2.在Stings.xml中添加一些字符串数组&#xff0c;离线数据管理、简体繁体…

python---数据容器

目录 环境安装 python语法 打印语句 注释 变量 变量声明 变量类型 boolean类型 占位符 控制数据精度 输入输出 条件控制 循环语句 while循环 for循环 函数 None类型 数据容器 列表 元组 字符串 序列 集合 字典 环境安装 1、安装python运行环境 Welcome t…

swiftui 中的app和 Scenes有什么,他们是什么关系

app和 Scenes有什么,他们是什么关系 SwiftUI 中的 app 和 Scenes 是两个相关的概念,它们都与应用程序的用户界面有关。 app 是指使用 SwiftUI 框架开发的应用程序,它包含了用户界面的所有内容和逻辑。在 SwiftUI 中,app 的界面通常由多个视图组成,每个视图都可以显示不同…