【数据结构与算法】Java链表与递归:移除链表元素
Java链表与递归:移除链表元素
解题思路
两种结题方式,使用虚拟头节点或者不使用。
使用虚拟头节点简单易理解,从虚拟头节点开始,一个一个地看下一个元素,是目标元素则改动当前节点next指针跳过一下,并且重新检查下一个节点(存在下两个及以上节点都应该删除的情况),不是目标元素就将下一个节点变为目标节点,直到下一个目标节点为空。最后返回的是虚拟头节点next指向的真实头节点。
不使用头节点要分两种状态考虑,一个是头节点就是要删除的目标节点,另外一个是非头节点是要删除的节点,两种处理方式不一样,首先进来检查头节点,如果是要删除的节点,直接将head指向头节点的下一个节点以跳过来删除,之后再次检查头节点(存在开头两个及以上都应该删除的情况),直到当前头节点不应该被删除或者链表被删空了,然后接下来才检查除开头节点之外的节点是否要删除。在检查之前,因为上次退出循环有两个条件,不知道是哪个条件导致循环退出的,所以需要判断一下链表是不是空了(即头结点为空),是则直接返回空,不是再类似使用虚拟头结点的方式将头结点之后的元素逐一判断或删除。
代码
class Solution {
// 使用虚拟头结点解决
public ListNode dummyHead(ListNode head, int val) {
// 虚拟头节点
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode cur = dummyHead;
while (cur.next!=null){
if(cur.next.val == val){
// ListNode delNode = cur.next;
// cur.next = cur.next.next;
// delNode.next = null;
// 内存自动回收,这样解决
cur.next = cur.next.next;
}else {
cur = cur.next;
}
}
// 返回头结点
return dummyHead.next;
}
// 使用一般方法解决
public ListNode normal(ListNode head, int val) {
// 每次节点不能为空,可能删除一个就空了,下一个判断会空指针异常
while (head != null && head.val == val) {
// ListNode delNode = head;
// head = delNode.next;
// delNode.next = null;
// 自动内存处理,直接跳过就好
head = head.next;
}
// 考虑到所有元素在头结点被删除
if (head == null) {
return null;
}
for (ListNode cur = head; cur.next != null; ) {
// 如果指针的下一个节点是要被删除的
if (cur.next.val == val) {
// ListNode delNode = cur.next;
// cur.next = cur.next.next;
// delNode.next = null;
// 内存自动回收,直接跳过
cur.next = cur.next.next;
} else {
// 如果每次执行会跳过连续被删除的节点
cur = cur.next;
}
}
return head;
}
public ListNode removeElements(ListNode head, int val) {
return dummyHead(head,val);
}
}
【数据结构与算法】Java链表与递归:移除链表元素的更多相关文章
- 数据结构与算法 java描述 第一章 算法及其复杂度
目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...
- 数据结构与算法Java描述 队列
package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...
- Java实现 LeetCode 203 移除链表元素
203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...
- 代码随想录训练营day 4|链表基础理论,移除链表元素,设计链表,反转链表
链表理论基础 链表是一种由指针串联在一起的线性结构,每一个节点都由一个数据域和一个指针域组成. 链表的类型有:单链表.双链表.循环链表. 链表的存储方式:在内存中不连续分布. 链表的定义很多人因为不重 ...
- Java数据结构和算法(八)——递归
记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和 ...
- 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
//用链表实现堆栈 /** * 节点类 */ class LinkS { private long data; public LinkS next; public LinkS(long d) { th ...
- 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除
/** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...
- 《Java数据结构与算法》笔记-CH5-链表-1单链表
/** * Link节点 * 有数据项和next指向下一个Link引用 */ class Link { private int iData;//数据 private double dData;//数据 ...
- 8, java数据结构和算法: 从阶乘来看递归的调用
直接上代码 public class RecursionDemo { //从阶乘看 递归的调用机制 public static void main(String[] args) { System.ou ...
- javascript实现数据结构与算法系列:功能完整的线性链表
由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...
随机推荐
- API接口请求小结
API接口请求小结 一.python: API接口请求 1.1 multipart/form-data类型请求 参数类型:数组 1.2 multipart/form-data类型请求 参数类型:文件流 ...
- 2024年终总结:5000 Star,10w 下载量,这是我交出的开源答卷
你好,我是 Kagol,个人公众号:前端开源星球. 2024年,我做前端开发工作满10年啦! 这10年我一直在开发前线,做过电商项目.广告平台.项目管理系统等业务,目前主要专注于前端组件库建设和开源社 ...
- Solution Set -「LOCAL」冲刺省选 Round XXVIII
\(\mathscr{Summary}\) A 题显然是图论模型嘛--但是卡得太久了,B 题 C 题都不好骗,裂开 qwq. 感觉时间安排上不尽合理,如果 B C 简单一点我这个就要挂打分了. ...
- w3cschool-Spring Cloud
https://www.w3cschool.cn/spring_cloud/spring_cloud-ryjs2ixg.html Spring Cloud(一)服务的注册与发现(Eureka) 202 ...
- HTB Builder walkthrough
nmap nmap -sS -A -T4 10.10.11.10 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-20 01:31 UTC Nma ...
- 搭建个人AI知识库:RAG与本地模型实践指南
引言 你是否想过拥有一个私人订制的AI助手,能够随时为你提供最个性化的信息?本文将带你一步步搭建一个基于本地模型和RAG技术的个人知识库. 搭建本地模型 环境 os: archlinux 内存: 32 ...
- redis 过期监听配置
package org.jeecg.config; import java.lang.reflect.Method; import java.time.Duration; import java.ut ...
- centos系统chrony时间同步
centos系统chrony时间同步 概要 chrony 是网络时间协议(Network Time Protocol )的通用实现.它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 ...
- ulimit命令 控制服务器资源
命 令:ulimit功 能:控制shell程序的资源语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大 小 ...
- 『玩转Streamlit』--会话状态管理
在Web应用开发中,会话管理是一个至关重要的概念,它能够帮助开发者追踪用户在应用中的行为和状态,从而为用户提供更加个性化.连贯且高效的交互体验. Streamlit作为一个简单而强大的用于快速构建和部 ...