Java链表与递归:移除链表元素

Java

https://leetcode-cn.com/problems/remove-linked-list-elements/solution/javalian-biao-yu-di-gui-yi-chu-lian-biao-264p/

解题思路

两种结题方式,使用虚拟头节点或者不使用。

使用虚拟头节点简单易理解,从虚拟头节点开始,一个一个地看下一个元素,是目标元素则改动当前节点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链表与递归:移除链表元素的更多相关文章

  1. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  2. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  3. Java实现 LeetCode 203 移除链表元素

    203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...

  4. 代码随想录训练营day 4|链表基础理论,移除链表元素,设计链表,反转链表

    链表理论基础 链表是一种由指针串联在一起的线性结构,每一个节点都由一个数据域和一个指针域组成. 链表的类型有:单链表.双链表.循环链表. 链表的存储方式:在内存中不连续分布. 链表的定义很多人因为不重 ...

  5. Java数据结构和算法(八)——递归

    记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和 ...

  6. 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈

    //用链表实现堆栈 /** * 节点类 */ class LinkS { private long data; public LinkS next; public LinkS(long d) { th ...

  7. 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除

    /** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...

  8. 《Java数据结构与算法》笔记-CH5-链表-1单链表

    /** * Link节点 * 有数据项和next指向下一个Link引用 */ class Link { private int iData;//数据 private double dData;//数据 ...

  9. 8, java数据结构和算法: 从阶乘来看递归的调用

    直接上代码 public class RecursionDemo { //从阶乘看 递归的调用机制 public static void main(String[] args) { System.ou ...

  10. javascript实现数据结构与算法系列:功能完整的线性链表

    由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...

随机推荐

  1. MYSQL查询:指定数值A表中B表没有对应数值

    MYSQL查询:指定数值A表中B表没有对应数值 在A表根据指定的arrange列的33743439, 33734907,33563462, 33563939等数值查询数据,连接B表,最后查询的结果只返 ...

  2. WPF刮刮乐

    WPF刮刮乐 <Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/wi ...

  3. MySQL---事务、死锁、mvcc原理

    前言 在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别. MySQL 是支持多事务并发执行的.否则来一个事务处理一个请求,处理一个人请 ...

  4. 基于同态加密的PSI开源库-1

    下面介绍一个PSI的开源库,还原论文:CCS2017:Fast Private Set Intersection from Homomorphic Encryption和CCS2018:Labeled ...

  5. Kotlin:【泛型】

  6. SQL Server统计信息更新会被阻塞或引起会话阻塞吗?

    在SQL Server数据库中,统计信息更新(UPDATE STATISTICS)会被其它会话阻塞吗?统计信息更新(UPDATE STATISTICS)会引起其它会话阻塞吗?在回答这两个问题前,我们必 ...

  7. [白话解析] 通俗解析集成学习之GBDT

    [白话解析] 通俗解析集成学习之GBDT 目录 [白话解析] 通俗解析集成学习之GBDT 0x00 摘要 0x01 定义 & 简述 1. GBDT(Gradient Boosting Deci ...

  8. 三种方式从jdbc中获取数据库表字段信息

    一.整体代码 1.method1:执行select语句获取,select * from dims where 1 = 2 2.method2:执行show create table获取,show cr ...

  9. AI 时代 UI 设计的哲学与伦理

    无论是在桌面.移动应用,还是未来可能出现的全新形态中,空间直觉始终是人类在数字世界中导航的根本. 丹尼尔·罗德里格斯 图片来源:维基百科 想象一下,踏入1427年佛罗伦萨圣母玛利亚诺维拉教堂昏暗的光线 ...

  10. Vue 组件里添加键盘事件 keydown keyup不生效问题

    我在使用VueDraggableResizable制作一个窗口,然后需要点击esc关闭窗口. 但是键盘事件没有生效,写任何位置都不行. 解决方案 在需要触发esc事件的div或其他上给出 tabind ...