Collection与数据结构 链表与LinkedList(二):链表精选OJ例题(上)

news2024/10/9 4:22:43

1. 删除链表中所有值为val结点

OJ链接
在这里插入图片描述

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return head;
        }
        ListNode pre = head;
        ListNode cur = head.next;
        while(cur != null){
            if(cur.val == val){
                pre.next = cur.next;
            }else{
                pre = pre.next;
            }
            cur = cur.next;
        }
        if(head.val == val){
            head = head.next;
        }
        return head;
    }
}

这个题我们在上一篇博客中实现单向链表中展示过,这里不再赘述.

2. 反转一个单链表

OJ链接
在这里插入图片描述

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null){
            return head;//列表为空的情况
        }
        if(head.next == null){
            return head;//结点只有一个的情况
        }
        ListNode cur = head.next;
        ListNode curNext = cur.next;//防止下一个结点找不到,所以定义curNext
        head.next = null;//先把头结点的next置为null,否者返回时会越界
        while(cur != null){
            cur.next = head;
            head = cur;
            cur = curNext;//头插法
            if(curNext !=null){
                curNext = curNext.next;//防止走到最后的时候空指针异常
            }
        }
        return head;
    }
}

动态演示:

翻转链表

[注意]

  1. 需要定义一个nodeNext结点来找到下一个结点,**,cur想要往后走的时候,不是我们想要找的下一个结点,因为在链表头插法修改了next的地址,**为了防止下一个结点的地址丢失,所以我们引入curNext.
  2. 在一开始的时候,需要把head.next置为空,因为翻转链表之后,一开始的头结点将是新链表的最后一个结点,最后一个结点的next为null.
  3. 在循环体内部要判断curNext是否为null,若没有,cur走到了最后一个结点的时候,curNext就位null了,在执行curNext = curNext.next的时候,就会出现空指针异常.

3. 链表的中间结点

OJ链接
在这里插入图片描述

class Solution {
    public ListNode middleNode(ListNode head) {
        if(head == null){
            return head;
        }
        ListNode slow = head;
        ListNode fast = head;//定义双指针
        while (fast != null && fast.next != null){//顺序不可以反,否则会nullException,
        //第一个是奇数的终止情况,第二个是偶数
            fast = fast.next.next;//快指针走两步
            slow = slow.next;//慢指针走一步
        }
        return slow;//最后慢指针指向的就是中间结点
    }
}

动态演示

寻找中间结点


[注意]

  1. 这个题大多数人想到的是通过计数的方法来遍历链表,之后再/2,这种方法固然没错,但是它的时间复杂度较高,它遍历了两次链表,为了只遍历一次就通过,我们引入了快慢指针,快指针的速度是慢指针的2倍.
  2. 这个题分为奇数项和偶数项,针对不同的项数,限制条件也不同.while (fast != null && fast.next != null)
  3. 限制条件while (fast != null && fast.next != null)的两个条件不可以反,如果fast==null,后面的条件就会报空指针异常.

4. 返回倒数第k个节点

OJ链接
在这里插入图片描述

这道题我们加大一点难度,把说明的条件删去.

class Solution {
    public int kthToLast(ListNode head, int k) {
        if (head == null) {
            return head.val;
        }
        if(k < 0){//负数返回null
            return -1;
        }
        ListNode slow = head;
        ListNode fast = head;
        int count = 0;
        while (count != k - 1) {//先让fast走k-1步
            if (fast != null) {//防止k太大导致fast越界
                fast = fast.next;
                count++;
            } else {
                return -1;//如果越界返回null
            }
        }
        while (fast.next != null) {//fast指向最后一个结点就结束,所以加上next
            fast = fast.next;
            slow = slow.next;
        }
        return slow.val;
    }
}

动态演示

寻找倒数第k个结点


[注意]

  1. 这道题和上一道题一样,许多人首先想到的就是遍历链表,得到size,减去k之后再遍历,这种做法可通过,但是效率欠缺.所以我们又引入了快慢指针.
  2. 既然删掉了限制条件,那么k就有可能是无效的,其中一种就是k小于0,通过if(k < 0)来限制.越界的情况,很多人又想,这不是还得遍历数组去得到size吗?其实不用,只要限制快指针在第一次走的时候不越界即可.if (fast != null)
  3. fast指向最后一个节结点的时候,slow就是中间结点,所以避免在while (fast.next != null)把next去掉,否者slow就会多走一格.

5. 合并两个有序链表

OJ链接
在这里插入图片描述

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode node = new ListNode(-1);//引入傀儡结点
        ListNode heada = list1;
        ListNode headb = list2;
        ListNode tmp = node;//定义临时结点用于遍历
        while(heada != null && headb != null){//遍历两个链表
            if(heada.val < headb.val){//比较对应位置的大小
                tmp.next = heada;
                heada = heada.next;
                tmp = tmp.next;//连接对应结点
            }else{
                tmp.next = headb;
                headb = headb.next;
                tmp = tmp.next;
            }
        }
        if(headb == null){//判断最后谁先走完,没走完的链表后面的值一定比已经走完那个链表后面的值大,所以直接连上即可
            tmp.next = heada;
        }else{
            tmp.next = headb;
        }
        return node.next;
    }
}

动态演示

合并两个有序链表


[注意]

  1. 这里我们为了把为了把两个链表串起来,我们需要引入傀儡结点,就像想要用一根线串起零散的珠子需要给这根线的头按上一根针一样.
  2. 两个链表总会有其中一个会先走完,其实走完之后,未走完的链表后面的结点其实都已经比走完链表的尾结点大了,所以直接串上去即可.

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

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

相关文章

天空卫士SASE 2.0:赋能您的数智安全

在这个以数据为核心的时代&#xff0c;企业的安全防线正面临着空前的挑战。随着对网络安全和数字化协作的需求不断攀升&#xff0c;企业如何在确保数据安全的前提下&#xff0c;维持业务的高效运转&#xff0c;成为了一个亟待解决的问题。企业管理者亟需一种集网络安全、云服务…

京东云16核64G云服务器租用优惠价格500元1个月,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

SD-WAN安全策略,保护企业网络的新边界

随着企业的数字化转型和网络架构的演变&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络技术&#xff0c;正在逐渐取代传统的基于硬件的广域网架构。然而&#xff0c;随之而来的安全威胁也在增加&#xff0c;因此在部署 SD-WAN时&#xff0c;制定合…

用Unity制作正六边形拼成的地面

目录 效果演示 1.在Unity中创建正六边形 2.创建一个用于管理正六边形的类 3.创建一个用于管理正六边形地面的类 4.创建一个空对象并将游戏控制脚本挂上 5.设置正六边形碰撞所需组件 6.创建正六边形行为触发脚本并挂上 7.创建圆柱体——田伯光 8.创建圆柱体移动脚本 运…

BootsJS上新!一个库解决大部分难题!

不知不觉距离第一次发文章介绍自己写的库BootsJS已经过去一个月了&#xff0c;这个月里收到了许许多多JYM的反馈与建议&#xff0c;自己也再一次对BootsJS进行了改进与完善&#xff0c;又一次增加了很多功能&#xff0c;为此我想应该给JYM们汇报汇报这个月的工作进展。 BootJS仓…

SpringBoot Actuator和Spring boot Admin工具

目录 一、Spring Boot Actuator 1、简介 2、访问方式 3、端点 4、SpringBoot项目引入actuator 端点 ①health ②beans ③configprops ④env ⑤loggers ⑥heapdump ⑦threaddump ⑧metrics ⑨scheduledtasks ⑩mappings ⑪shutdown 定制端点 一、定制health端…

【Spring Cache】基于注解的缓存框架 简化redis代码

文章目录 一、介绍二、常用注解三、快速入门3.1 EnableCaching3.2 CachePut3.3 Cacheable3.4 CacheEvict 一、介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层…

产品经理与产品原型

点击下载《产品经理与产品原型》 1. 前言 互联网产品经理在向技术部门递交产品策划方案时,除了详尽的需求阐述,一份清晰易懂的产品原型设计方案同样不可或缺。一份出色的原型设计,不仅能促进前期的深入讨论,更能让美工和开发人员更直观地理解产品特性,进而优化工作流程,…

Java代码基础算法练习-求偶数和-2024.03.29

任务描述&#xff1a; 编制程序&#xff0c;输入n个整数&#xff08;n从键盘输入&#xff0c;n>0&#xff0c;整数取值范围&#xff1a;0~1000&#xff09;&#xff0c;输出这n个 数当中的偶数和。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import…

金三银四面试题(七):JVM常见面试题(1)

JVM会有许多零碎但是却很高频的基础考题。牢记这些&#xff0c;才能保证不在面试中落后于人。 说说对象分配规则 这也是之前面试腾讯时候被问到的问题&#xff1a;请介绍JVM如何分配对象&#xff1f; 对象优先分配在Eden 区&#xff0c;如果Eden 区没有足够的空间时&#xf…

软件测试基础理论、测试用例及设计方法、易混淆概念总结【软件测试】

一.软件测试基础理论 1.软件定义 软件是计算机系统中与硬件相互依存的一部分&#xff0c;包括程序、数据以及与其相关文档 的完整集合。 程序是按事先设计的功能和性能要求执行的指令序列&#xff1b; 数据是使程序能正常操作信息的数据结构&#xff1b; 文档是与程序开发、维…

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型&#xff0c;和Seq2Seq不冲突。 …

开源免费软件推荐PhotoPrism:一款基于TensorFlow的开源照片管理工具,实现自动图像分类与本地化部署

引言&#xff1a; PhotoPrism&#xff0c;这款基于机器学习软件Google TensorFlow的开源照片管理工具&#xff0c;不仅实现了自动图像分类&#xff0c;更能够精准检测图片的颜色、色度、亮度、质量等属性。无论是全景照片还是地理位置信息&#xff0c;它都能轻松识别。更重要的…

k8s-jenkins安装与流水线

k8s-jenkins安装与流水线 一、环境安装1.创建目录2.后台启动服务3.浏览器访问4.修改密码 二、流水线1.新建流水线任务2.运行流水线3.安装插件4.安装Kubernetes CLI 三、总结 一、环境安装 如果使用的是阿里云Kubernetes集群 &#xff0c;可以安装其 ack-jenkins应用。 5分钟在…

KVM:尝试安装windows2008

最终目的是在lxd部署windows2008镜像 WindowsServer2008镜像&#xff1a; cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso 镜像参考链接&#xff1a; https://discussion.scottibyte.com/t/migrate-a-hyper-v-windows-vir…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外&#xff0c;所以.com版&#xff08;https://developer.unity.cn/&#xff09;不一定稳定&#xff0c;学习时推荐从.cn国内版&#xff08;https://developer.unity.cn/&#xff09;前往下载&#xff0c;但是后期仍需回…

【全套源码教程】基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

桌面/WEB端3D开发工具HOOPS SDK简介

Tech Soft 3D在长达25年的时间内&#xff0c;一直通过卓越的3D技术帮助全球超过600家客户推动创新&#xff0c;这些客户包括HEXAGON、SolidWorks、SIEMENS、Aras、ANSYS、AVEVA等各个行业的领军者。 Tech Soft 3D旗下拥有4款原生产品&#xff0c;分别是&#xff1a;HOOPS Excha…

docker-compose mysql

使用docker-compose 部署 MySQL&#xff08;所有版本通用&#xff09; 一、拉取MySQL镜像 我这里使用的是MySQL8.0.18&#xff0c;可以自行选择需要的版本。 docker pull mysql:8.0.18二、创建挂载目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /dat…