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

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;//防止下一个结点找不到,所以定义curNexthead.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){//负数返回nullreturn -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指向最后一个结点就结束,所以加上nextfast = 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.hqwc.cn/news/578714.html

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

相关文章

解决WSL更新速度慢的方案

在Windows上安装Docker Desktop时&#xff0c;如果选择使用WSL&#xff0c;则可能会出现在运行程序前要求升级WSL的步骤。程序会提示使用下面指令来升级 wsl.exe --update但是升级速度特别慢&#xff0c;于是在网络不稳定的情况下经常会出现下载失败的情况。 百度里一直没搜到…

YOLO格式数据集转COCO格式

网上找了很久的YOLO格式数据集转COCO格式的代码&#xff0c;但是没有一个成功的&#xff0c;费尽千辛万苦终于找到一个能用的&#xff0c;因此记录一下。 一、首先YOLO格式数据集文件布局 其中lmages和labels 中的内容布局如下&#xff0c;只不过一个存放图片&#xff0c;一个存…

物联网实战--入门篇之(三)嵌入式STM32

目录 一、Keil简介 二、工程结构 三、文件目录 四、STM32简介 五、编码风格 六、总结 一、Keil简介 Keil是一款常用的单片机开发工具&#xff0c;主要包含了编译、仿真、调试和开发界面(IDE)&#xff0c;后被ARM公司收购&#xff0c;与其MDK-ARM合并为MDK-ARM Keil软件包…

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;所有地址均配为公有IP地址。 - 在R5上&#xff0c;将接口配置为公有IP地址&#xff0c;并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2于R5之间…

vue+elementUI搭建动态表头的表格

前提&#xff1a;以下代码是vue2项目结合elementUi完成的 数据结构 后端传来的数据是两个list&#xff0c;一个表头的list&#xff0c;一个表格内容的list // 表头 headTableAtts: [{ columnLabel: 姓名, columnName: name },{ columnLabel: 年龄, columnName: age },{ colu…

KT-0855大小鼠Y迷宫——动物行为研究的实验设备

大小鼠Y迷宫视频分析系统是一种专门应用于动物行为研究的实验设备&#xff0c;主要用于评估动物的空间记忆、辨别性学习以及工作记忆等认知功能。该系统通过捕捉和分析动物在迷宫中的行为表现&#xff0c;提供了一系列参数&#xff0c;如进入各臂的次数、时间、正确次数、错误次…

Web APIs知识点讲解(阶段五)

DOM- 网页特效篇 一.课前回顾(手风琴) <!DOCTYPE html> <html><head lang"en"><meta charset"UTF-8"><title>手风琴</title><style>ul {list-style: none;}* {margin: 0;padding: 0;}div {width: 1200px;heig…

LoRA 及其衍生技术总览:An Overview of the LoRA Family

编者按&#xff1a; 对于大语言模型的微调训练来说&#xff0c;传统的全参数微调方法需要处理数百万甚至数十亿级别的参数&#xff0c;计算量和显存占用都非常大。而 LoRA 这种技术方案&#xff0c;通过引入少量的可训练矩阵来调整预训练模型的行为&#xff0c;极大降低了训练所…

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…

C语言数据结构易错知识点(6)(快速排序、归并排序、计数排序)

快速排序属于交换排序&#xff0c;交换排序还有冒泡排序&#xff0c;这个太简单了&#xff0c;这里就不再讲解。 归并排序和快速排序都是采用分治法实现的排序&#xff0c;理解它们对分支思想的感悟会更深。 计数排序属于非比较排序&#xff0c;在数据集中的情况下可以考虑使…