【数据结构与算法】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实现数据结构与算法系列:功能完整的线性链表
		
由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...
 
随机推荐
- Netty-快速入门
			
---------------------------------------------------- netty是什么? Netty is an asynchronous event-driven ...
 - xxl-job安装
			
---------------------------------------------------------------------------------------------------- ...
 - bootwiki-Elasticsearch教程
			
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html Elasticsearch教程 Elasticse ...
 - biancheng-Pygame(python)
			
http://c.biancheng.net/pygame/ Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统 ...
 - mac环境安装Gradle及配置
			
mac环境安装Gradle及配置 说明#  最近在学习spring源码, 需要使用到gradle, 便从小白开始吧  ps: 基本按官方操作来完成的~ 前提#  从Gradle官网的安装指导可以 ...
 - atomikos实现分布式事务
			
date: 2022-04-25 categories: [java, 编程] tags: [分布式事务] 概述 多数据源单服务写入, 分布式事务实现 使用随机数控制产生异常 注: 网上很多都是只有多 ...
 - 「CF1101F」Trucks and Cities
			
题意描述 有 \(N\) 座城市,第 \(i\) 座坐标为 \(a_i\) ,有 \(M\) 辆卡车,第 \(i\) 辆卡车要从城市 \(s_i\) 前往城市 \(e_i\) ,每单位长度耗油量为 \ ...
 - Linux/Centos文件授权用户文件夹权限介绍
			
一.Linux文件权限介绍 在Linux中,一切皆为文件(目录也是文件),每个文件对用户具有可读(read).可写(write).可执行(excute)权限.目录的执行操作表示是否有权限进入该目录并操 ...
 - Celery异步分布队列
			
Celery分布式任务队列 一.Celery介绍celery periodic task Celery 是一个基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的 ...
 - Log4j2 Garbage-free 无垃圾回收模式实践与总结
			
Log4j2 内置 Garbage-free(无垃圾)模式,可重用对象和缓冲区,减少日志记录时产生的垃圾对象,避免 JVM 进行 GC 回收,进而提升应用程序的性能与响应速度.以下以 Log4j2 的 ...