链表总结(2)

news2025/1/21 15:39:55

theme: fancy

又是链表专题啦,老样子,标题就是leetcode链接,在这里只放我的代码答案和注释

141环形链表

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null || head.next == null)   return false;
        if(head.next == head) return true;
        ListNode slow = head;
        ListNode fast = head.next;
        while(slow != fast) {
            slow = slow.next;
            fast = fast.next;
            if(fast == null)    break; 
            fast = fast.next;
            if(fast == null)    break;  // 告诉我们每一步走的路都要检查一下
            if(slow == fast && fast != null) {
                return true;
            }
        }
        return false;
    }
}

142环形链表2

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null)   return null;
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null) {   // 这个判断条件很关键
            slow = slow.next;
            fast = fast.next;
            if(fast == null)    break; 
            fast = fast.next;
            if(slow == fast) {
                slow = head;
                fast = fast.next;
                while(slow != fast) {  // 开始循环找到相遇的起始点
                    slow = slow.next;
                    fast = fast.next;
                }
                if(slow == fast) {
                    return fast;
                }
            }
        }
        return null;
    }
}

21合并两个有序链表

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 创建两个指针 cur 和 ans,ans 用于记录合并后链表的头部,cur 用于迭代操作
        ListNode cur = new ListNode(), ans = cur;

        // 循环直到 list1 和 list2 都遍历完
        while(list1 != null && list2 != null) {
            // 比较 list1 和 list2 当前节点的值,将较小值的节点接入合并后的链表
            if(list1.val > list2.val) {
                ans.next = list2;
                list2 = list2.next;
            } else {
                ans.next = list1;
                list1 = list1.next;
            }
            ans = ans.next; // 移动合并后链表的指针到下一个节点
        }

        // 处理某个链表遍历完后,将剩余未遍历完的链表直接接入合并后的链表末尾
        ans.next = list1 == null ? list2 : list1;

        return cur.next; // 返回合并后链表的头节点
    }
}

2两数相加

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
/ 创建一个ArrayList来存储相加的结果  
        List<Integer> ans = new ArrayList<>();  
          
        // 当l1和l2都不为空时,进行相加操作  
        while(l1 != null && l2 != null) {  
            int a = l1.val;  // 获取l1的当前值  
            int b = l2.val;   // 获取l2的当前值  
            ans.add(a + b);    // 将a和b相加的结果添加到ans中  
            l1 = l1.next;       // 将l1移动到下一个节点  
            l2 = l2.next;        // 将l2移动到下一个节点  
        }  
          
        // 如果l1或l2有一个为空,另一个不为空,将非空链表的剩余部分添加到ans中  
        if(l1 != null || l2 != null) {  
            ListNode cur = (l1 == null ? l2 : l1);  // 确定非空链表的起始节点  
            while(cur != null) {  
                ans.add(cur.val);  // 将非空链表的剩余部分添加到ans中  
                cur = cur.next;    // 将cur移动到下一个节点  
            }  
        }  
          
        // 初始化结果链表的头节点res和尾节点res2  
        ListNode res = new ListNode();  
        ListNode res2 = res;  // res2用于返回结果链表的头节点,因为res可能被重新赋值  
          
        // 初始化进位标志go,初始值为0  
        int go = 0;  
        for(int i = 0; i < ans.size(); i ++) {  // 遍历ans中的每个数字  
            System.out.println(ans.get(i));  // 打印当前数字,用于调试或测试目的  
            int temp = go;  // 存储当前的进位值  
            go = 0;  // 重置进位值为0,因为当前数字已经处理完毕  
            if(ans.get(i) + temp > 9) {  // 如果当前数字加上之前的进位值大于9,需要进行进位处理  
                go ++;  // 进位值为1,因为需要向高位进位  
                temp += ans.get(i) - 10;  // 减去10是为了在下一次循环中处理进位后的数字部分  
            } else {  // 如果当前数字加上之前的进位值小于等于9,不需要进行进位处理  
                temp += ans.get(i);  // 将当前数字加到temp上,作为下一次循环处理的新数字的一部分  
            }  
            res.next = new ListNode(temp);  // 将temp作为新的节点添加到结果链表中  
            res = res.next;  // 将res移动到新添加的节点上,以便在下一次循环中处理下一个数字部分  
        }  
        if(go != 0) {  // 如果最终仍有进位,则添加一个值为1的节点到结果链表的末尾(作为进位表示)  
            res.next = new ListNode(1);  // 将进位值1作为新的节点添加到结果链表的末尾(如果存在)  
        } else {  // 如果最终没有进位,则返回结果链表的头节点(即res2)作为最终结果链表的起始节点  
            return res2.next;  // 返回结果链表的头节点(即res2的下一个节点)作为最终结果链表的起始节点  
        }  
    }  

这里的注释是让文心一言帮我加的,老实说加的太多了太详细了。。。

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

image.png

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null)    return head;
        ListNode cur = head;
        int size = 0;
        while(cur != null) {
            size ++;
            cur = cur.next;
        }
        if(n == size) return head.next;  // 这个是专门为了过特殊用例写的
        cur = new ListNode(-1, head);
        for(int i = 0;i < size - n;i ++) {
            cur = cur.next;
        }
        cur.next = cur.next.next;
        return head;
    }
}

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

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

相关文章

视频编辑与制作,视频尺寸修改器

你是否曾因为视频尺寸与平台不匹配无法上传而烦恼&#xff1f;这个时候一款视频尺寸修改工具&#xff0c;就能帮你轻松搞定。不论是为了适应不同的平台要求&#xff0c;还是为了获得不一样的观看体验&#xff0c;【视频剪辑高手】都能为你提供完美的解决方案。 所需工具&#…

Linux之定时任务调度

crond crond是Linux系统中的一个守护进程&#xff0c;主要用于周期性地执行某种任务或等待处理某些事件。而crondtab是配套的工作&#xff0c;用于定时任务的设置。 语法 crontab [选项]常用选项 入门案例 执行crontab -e命令输入任务到调度文件中 */1 * * * * ls -l /et…

竞赛保研 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

数据库——创建存储过程、函数和触发器安装phpmyadmin

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;…

基于ssm的二手商品交易平台+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

NFC物联网智慧校园解决方案

近场通信(Near Field Communication&#xff0c;NFC)又称近距离无线通信&#xff0c;是一种短距离的高频无线通信技术&#xff0c;允许电子设备之间进行非接触式点对点数据传输交换数据。这个技术由免接触式射频识别(RFID)发展而来&#xff0c;并兼容 RFID&#xff0c;主要用于…

vue实力挂载的过程中都发生了什么?今天来聊聊Vue实例挂载的过程

一、思考 我们都听过知其然知其所以然这句话 那么不知道大家是否思考过new Vue()这个过程中究竟做了些什么&#xff1f;过程中是如何完成数据的绑定&#xff0c;又是如何将数据渲染到视图的等等 一、分析 首先找到vue的构造函数 源码位置&#xff1a;src\core\instance\in…

SAP CO系统配置-与PS集成相关配置(机器人制造项目实例)

维护分配结构 配置路径 IMG菜单路径:控制>内部订单>实际过帐>结算>维护分配结构 事务代码 OKO6 维护结算参数文件 定义利润分析码

C# 通过SharpCompress.Archives.Rar解压RaR文件

/// <summary>/// 解压一个Rar文件/// </summary>/// <param name"RarFile">需要解压的Rar文件&#xff08;绝对路径&#xff09;</param>/// <param name"TargetDirectory">解压到的目录</param>/// <param name&…

4.26 构建onnx结构模型-Suqeeze

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Suqeeze 结点进行分析 方式 方法一…

普中STM32-PZ6806L开发板(HAL库函数实现-USART1 printf+scanf/gets)

简介 实现printfscanf/gets通过USART1 的发送接收。 电路原理图 板载USB CH340串口电路原理图主芯片串口引脚图 我的板子板子自带串口坏掉了, 所以使用USB转TTL线, 连接如下 电路原理图 实物图 其他知识 scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符…

antv/x6_2.0学习使用(三、内置节点和自定义节点)

内置节点和自定义节点 一、节点渲染方式 X6 是基于 SVG 的渲染引擎&#xff0c;可以使用不同的 SVG 元素渲染节点和边&#xff0c;非常适合节点内容比较简单的场景。面对复杂的节点&#xff0c; SVG 中有一个特殊的 foreignObject 元素&#xff0c;在该元素中可以内嵌任何 XH…

MybatisPlus关于${ew.customSqlSegment},${ew.sqlSegment},${ew.sqlSelect},${ew.sqlSet}

Wrapper中 ${ew.customSqlSegment} 是where 条件 ${ew.sqlSegment} 只有条件 ${ew.sqlSelect}是指查询的字段,如果需要使用 ${ew.sqlSet}是在更新时候使用,使用方式 了解即可,不建议使用 毕竟${}有sql注入风险

基于ssm的教师办公管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本教师办公管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

算法刷题:最大异或对(Trie树扩展)、食物链(并查集扩展)

目录 引言一、最大异或对&#xff08;Trie树扩展&#xff09;1.题目描述2.解题思路3.代码实现4.测试 二、食物链&#xff08;并查集扩展&#xff09;1.题目描述2.解题思路3.代码实现4.测试 引言 这两个扩展题能够让我们更加的熟悉Trie树和并查集的使用&#xff0c;这两道题可以…

AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲

【课程简介】 本课程介绍了chatGPT相关模型的具体案例实践&#xff0c;通过实操更好的掌握chatGPT的概念与应用场景&#xff0c;可以作为chatGPT领域学习者的入门到进阶级课程。 【课程时长】 1天&#xff08;6小时/天&#xff09; 【课程对象】 理工科本科及以上&#xff0…

用通俗易懂的方式讲解大模型:HugggingFace 推理 API、推理端点和推理空间使用详解

接触 AI 的同学肯定对HuggingFace[1]有所耳闻&#xff0c;它凭借一个开源的 Transformers 库迅速在机器学习社区大火&#xff0c;为研究者和开发者提供了大量的预训练模型&#xff0c;成为机器学习界的 GitHub。 在 HuggingFace 上我们不仅可以托管模型&#xff0c;还可以方便…

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据

1、介绍 前面已经完成了7项工作&#xff1a; C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…

平台无关性和语言无关性的记录

目录 背景 平台无关性 语言无关性 背景 最近在学习Java虚拟机&#xff08;JVM: Java Virtual Machine&#xff09;,在学习过程中&#xff0c;再一次学习了JVM的平台无关性这一特性&#xff0c;此外也了解到了虚拟机的另外一种中立特性 --- 语言无关性&#xff0c;下面进行简单…

挂载与解挂载

一. 挂载 1.什么是挂载 将系统中的文件夹和磁盘做上关联&#xff0c;使用文件夹等于使用磁盘 2.mount 2.1 格式 mount [ -t 类型 ] 存储设备 挂载点目录 mount -o loop ISO镜像文件 挂载点目录 注意&#xff1a;指明要挂载的设备 设备文件&#xff1a;例如:/dev/sda5 卷…