Leetcode链表刷题总结(Java版)

链表

1、移除链表元素(考虑全情况)

问题需求:根据给定的val值,移除链表中值是这个val的节点

203. 移除链表元素 - 力扣(LeetCode)

这里有一个问题就是,如果需要被移除的节点不是中间的某个节点,而是头节点。就没法借助前一个节点了,而是直接将

head = head.next

所以有两种思路,要么是分类处理;要么是在原本的head节点前面增加一个虚拟头节点,这样头节点也有个前面的节点了

还有需要注意的是,这里的代码,不应该用if,因为我们是一直移除的一个过程,所以应该用while

  • 思路一:
public ListNode removeElements(ListNode head, int val) {while(head != null && head.val == val)  //之所以不用if,是因为可能从头结点开始有连续的等于val的节点head = head.next;ListNode cur = head;		//删除非头节点情况while(cur != null && cur.next != null){if(cur.next.val = val)cur.next = cur.next.next;elsecur = cur.next;}return head;
}
  • 思路二:
ListNode dummyHead = new ListNode(0); // 设置⼀个虚拟头结点
dummyHead.next = head; 			// 将虚拟头结点指向head,这样⽅⾯后⾯做删除操作
ListNode cur = dummyHead;
while(cur.next != null){...
}
return dummyHead.next;

2、设计链表【个人觉得想熟悉链表时可以练这个】

  • 707. 设计链表 - 力扣(LeetCode)

在这里插入图片描述

就是实现关于链表的各个操作,为了方便,还是用上了虚拟头节点

初始化中的0就是虚拟头节点了

3、反转链表(双指针)

206. 反转链表 - 力扣(LeetCode)

双指针法

遍历链表,按照头插法,将旧链表的一个个节点放到新链表的头节点,最后反转成功

public ListNode reverseList(ListNode head) {ListNode cur = head;ListNode first = null;while(cur!=null){ListNode tmp = cur.next;    // 保存⼀下 cur的下⼀个节点,因为接下来要改变cur->nextcur.next = first;           //头部插入//更新双指针first = cur;cur = tmp;}return first;
}

4、两两交换链表中的节点(借助虚拟头节点)

24. 两两交换链表中的节点 - 力扣(LeetCode)

在这里插入图片描述

需要借助虚拟头节点,这样操作会简单一点

每次需要一个指针cur指向需要被交换的两个节点,的前一个节点

顺序就是,虚拟头节点先指向2,然后让2指向1,最后1指向3。而这里的“1”和“3”是需要两个临时节点记录一下

public ListNode swapPairs(ListNode head) {ListNode  dummyHead = new ListNode(0);dummyHead.next = head;ListNode cur = dummyHead;while(cur.next != null && cur.next.next != null){ListNode tmp = cur.next;ListNode tmp1 = cur.next.next.next;cur.next = cur.next.next;cur.next.next = tmp;cur.next.next.next = tmp1;cur = tmp;                  // 或者cur = cur.next.next;  cur移动两位,准备下⼀轮交换}return dummyHead.next;
}

5、删除链表倒数第N个节点(快慢指针)

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

  • 由于需要删除的是倒数第N个,所以可以用快慢指针

  • 双指针的经典应⽤,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了

  • 这里需要注意的就是,需要虚拟头节点,考虑到了如果链表只有一个元素,或者只有两个元素的情况

    这种时候,用到虚拟头节点,就很好的可以处理

    另外,最后返回的时候,不要返回head,而是返回dummyhead.next,因为如果只有一个节点的情况,删除后,就没有head,就知识null了,所以不能返回head

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyhead = new ListNode(0);dummyhead.next = head;ListNode fast = dummyhead;ListNode slow = dummyhead;for(int i = 0; i < n; i++)fast = fast.next;fast = fast.next;			 // fast再提前⾛⼀步,因为需要让slow指向删除节点的上⼀个节点while(fast != null){      slow = slow.next;fast = fast.next;}slow.next = slow.next.next;return dummyhead.next;      //不能返回head,只能是dummyhead.next
}

6、链表相交:寻找两个链表(无环结构)重合结点

面试题 02.07. 链表相交 - 力扣(LeetCode)

  • 其实这个链表问题主要需要总结的就是那些经验及方法,而对于两个无环结构的链表,就是常规方法

    ​ 先是求出连两个链表的长度length1,length2,然后就是需要判断这两个链表的尾结点是不是一样的

    ​ 如果连尾结点都不一样,就说明两个链表连一个结点都没有重合,所以两个链表绝对不会重合

    如果尾结点一样的话,需要将两个链表的长度互减

    ​ 然后这个数num的绝对值就是这两个链表长度的差值,**让长链表提前走num步,然后两个链表再同时走,**直到遇见了相同的交点处停下来返回此结点,具体代码如下:

    public static Node noLoop(Node head1, Node head2) {if (head1 == null || head2 == null) {	return null;   }Node cur1 = head1;Node cur2 = head2;int n = 0;                      //这里为了简化以及节省空间,就设置了一个变量n,通过下面的两个while循环,一个自加,一个自减,最后求他的绝对值,就是两个链表的长度差值while (cur1.next != null) {n++;cur1 = cur1.next;}while (cur2.next != null) {n--;cur2 = cur2.next;}if (cur1 != cur2) {			   //如果最后一个结点都不一样,那么两个链表绝对不可能有交合的地方了return null;              }cur1 = n > 0 ? head1 : head2;			//谁长,谁的头变成cur1cur2 = cur1 == head1 ? head2 : head1;	 //谁短,谁的头变成cur2n = Math.abs(n);while (n != 0) {			  //先让长链表走了n步n--;cur1 = cur1.next;}while (cur1 != cur2) {		  //开始寻找相交结点cur1 = cur1.next;cur2 = cur2.next;}return cur1;
    }
    

7、环形链表

142. 环形链表 II - 力扣(LeetCode)

划分为两个问题:

  1. 判断有环无环
  2. 如果有环的话,找到环的起始节点

1)判断有环无环

判断链表是否有环,可以借助哈希表set,也可以用快慢指针,

**1)哈希表set:**将所有节点放进set中,每放进去一个节点都查查这个节点是不是在集合中,第一次查到这个节点在集合中的时候,就说明这个节点就是环的起点

2)快慢指针: 只要最后不会指向空【如果快指针指向空了,就说明没有环】,并且快慢指针重合,就说明该链表又环。判断有环之后,就要开始找环的起始点,看下面的描述

//哈希表set
public static boolean hasCycle(Node head){HashSet<Node> set = new HashSet<Node>();set.add(head);Node cur = head.next;while(true){if(set.contains(cur))return true;else{set.add(cur);cur=cur.next;if(cur==null)return false;}}
}
//快慢指针
public static boolean ifCycle(Node head){Node slow = head;Node fast = head.next;while(fast != slow){if(fast == null)return false;slow = slow.next;fast = fast.next.next;}return true;
}

2)找到环的起始节点

这里一开始还是借助快慢指针,先是判断有无环结构:

  1. 如果有环的话,也就是说快慢指针在环上的某一个结点上重合了。(这是第一个while循环)

  2. 此后就到了本方法的骚气处了【这是通过公式推导出来的规律!!记住这个结论!!!】

    • 将快指针转移到头结点的位置,慢节点还是在原来环上面两个指针相遇的位置
    • 快慢指针的的移动步长都变为一
    • 此时他们再相遇重合的那个位置就是环结点的起始处了(这是第二个while循环),直接上代码:
public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;if(slow == fast)break;}if(fast == null || fast.next == null)  //跳出上面循环时有两种可能,一是没有环,另外就是slow == fast。所以需要判断如果										//无环的话,直接返回nullreturn null;fast = head;while(fast != slow){fast = fast.next;slow = slow.next;}return fast;
}

8、判断回文结构

借助栈

public static boolean isPalindrome1(Node head) {Stack<Node> s = new Stack<Node>();Node cur = head;while(cur != null){s.push(cur);cur = cur.next;}cur = head;while(head != null){if(head.val != s.pop().val)return false;head = head.next;}return true; 
}

本文是基于学习代码随想录,以及自刷leetcode总结链表方面的笔记,不仅仅限于代码随想录笔记,是一些自己的思考和整理。并且是Java版本

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

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

相关文章

Tuxera2023 NTFS for Mac下载,安装和序列号激活

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

【Java基础知识总结 | 第十篇】HashSet底层实现原理

文章目录 10.HashSet底层实现原理10.1HashSet特点10.2HashSet源码10.3 add流程10.4总结 10.HashSet底层实现原理 10.1HashSet特点 存储对象&#xff1a;HashSet 存储对象采用哈希表的方式&#xff0c;它不允许重复元素&#xff0c;即集合中不会包含相同的元素。当向 HashSet …

数据挖掘中的PCA和KMeans:Airbnb房源案例研究

目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…

【微服务】------核心组件架构选型

1.微服务简介 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦&#xff0c;从而降低系统的耦合性&#xff0c;并提供更加灵活的服务支持。 2.微服务技术选型 区域内容…

Kotlin学习日志(一)TextView、Button、Toast的使用(1)

android:layout_width“wrap_content” android:layout_height“wrap_content”/> import kotlinx.android.synthetic.main.activity_main.* 这句话的意思是引进Kotlin的的控件变量自动映射功能&#xff0c;接下来只要是这个activity_main.xml文件中的控件&#xff0c;我…

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R&#xff0c;问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …

OpenTofu路在何方:定量分析Terraform issue数据,洞察用户需求|OpenTofu Day 闪电演讲

数澈软件 Seal 首席架构师李平辉提交的演讲议题“Alias TerraformTofu. Job’s Done, Now What?”入选 KubeCon EU 同场活动 OpenTofu Day&#xff0c;本文为演讲实录。 大家好&#xff0c;我是 Lawrence&#xff0c;是 Seal 的首席架构师。今天将由我为大家带来 Lightening T…

后端开发框架Spring Boot快速入门

写在前面 推荐将本文与Spring Boot 相关知识和工具类一文结合起来看&#xff0c;本文为主&#xff0c;上面那篇文章为辅&#xff0c;一起食用&#xff0c;以达到最佳效果&#xff0c;当然&#xff0c;大佬随意。 IDEA创建Spring Boot工程 关于Spring Boot框架项目&#xff0…

第二节课《轻松玩转书生·浦语大模型趣味 Demo》

比较匆忙&#xff0c;假期前仿照第一期课程的内容好像被清空了&#xff0c;重新搭建一次。 https://github.com/InternLM/Tutorial/blob/camp2/helloworld/hello_world.md 按照那老师写好的&#xff0c;一步步复制就好了 浦语灵笔2的大概率是会超出显存&#xff0c;先不测试了…

MySQL-排序与分页

1. 排序 如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的。 SELECT * FROM employees;1.1 基本使用 1&#xff09;使用 ORDER BY 对查询到的数据进行排序操作。 升序&#xff1a;ASC(ascend)降序&#xff1a;DESC (descend) 练习&am…

2024.4.4-[作业记录]-day09-CSS 布局模型(标准流模型、浮动模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.4-学习笔记1 CSS 布局模型1.1 标准流1.2 CSS 浮动1.3 去除塌陷 2…

【零基础学数据结构】顺序表实现书籍存储

目录 书籍存储的实现规划 ​编辑 前置准备&#xff1a; 书籍结构体&#xff1a; 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…

SpamSieve mac垃圾邮件过滤器 直装激活版

SpamSieve通过强大的垃圾邮件过滤技术&#xff0c;帮助用户有效管理和消除不想要的电子邮件。它能与多种电子邮件客户端无缝集成&#xff0c;如Apple Mail、Microsoft Outlook、Airmail等。 软件下载&#xff1a;SpamSieve mac直装激活版下载 该软件利用先进的算法和机器学习技…

深度学习方法;乳腺癌分类

乳腺癌的类型很多&#xff0c;但大多数常见的是浸润性导管癌、导管原位癌和浸润性小叶癌。浸润性导管癌(IDC)是最常见的乳腺癌类型。这些都是恶性肿瘤的亚型。大约80%的乳腺癌是浸润性导管癌(IDC)&#xff0c;它起源于乳腺的乳管。 浸润性是指癌症已经“侵袭”或扩散到周围的乳…

TR3 - Transformer算法详解

目录 文本输入处理词向量位置向量 编码器 EncoderSelf-Attention多头注意力机制残差连接 解码器 Decoder线性层与Softmax损失函数总结与心得体会 这周来看一下Transformer是怎么将文本转换成向量&#xff0c;然后又输入到模型处理并得到最终的输出的。 文本输入处理 词向量 …

【opencv】教程代码 —ml (主成分分析、支持向量机、非线性支持向量机)

1. introduction_to_pca.cpp 主成分分析 /*** file introduction_to_pca.cpp* brief 这个程序演示了如何使用OpenCV PCA 提取物体的方向* author OpenCV团队*/// 包含OpenCV函数库所需要的头文件 #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp&q…

[VulnHub靶机渗透] pWnOS 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

LeetCode刷题实战1:两数之和

从今天开始加入刷题大军&#xff0c;把算法题刷爆&#xff0c;我们直接进入主题。 题目内容 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…