简单实现链表增删改查

2023-11-20

学习目标:

  • 简单实现链表增删改查

学习内容:

  1. 外部类和内部类
  2. 封装方法
  3. 其他类使用内部类私有方法
  4. 递归算法

代码块:

class test{
  public static void main(String[] args){
    Nodelianbiao nlb = new Nodelianbiao();
        nlb.add(10);
        nlb.add(9);
        nlb.add(8);
        nlb.add(7);		//添加数据
        nlb.print();	//输出所有数据
        nlb.del(9);		//删除元素为9的数据
        nlb.print();	
        System.out.println(nlb.find(11));	//查询元素是否存在
        nlb.update(7,8);	//修改元素(7改成8)
        nlb.print();		
        nlb.insert(3,11);	//插入元素(在小标为3的位置插入元素为11的数据)
        nlb.print();
  }
}

class Nodelianbiao{
    private Node root;      //根节点
    private int countindex = 0;
    public void add(int data){
        if(root == null){
            root = new Node(data);
            countindex++;
        }else{
            root.addNode(data);
        }
    }
    public void del(int data){
        if(root.getData() == data){
            root = root.next;
            countindex--;
        }else{
            root.delNode(data);
        }
    }
    public void print(){
        if(root!=null){
            System.out.print(root.data+"=>");
            root.printNode();
            System.out.println();
        }
    }
    public boolean find(int data){
        if (root.getData() == data) return true;
        else{
            if (root.findNode(data)) return true;
        }
        return false;
    }
    public void update(int olddata,int newdata){
        if(find(olddata)){
            if(root.getData() == olddata){
                root.setData(newdata);
            }
            else{
                root.updateNode(olddata,newdata);
            }
        }
        else{
            System.out.println("无此数据");
        }
    }
    public void insert(int index,int data){
        if(this.countindex>=index){
            int temp = 0;
            if(index == 0){
                Node root1 = new Node(data);
                root1.next = root;
                root = root1;
            }
            else{
                temp++;
                root.insertNode(index,data,temp);
            }
        }
    }

    private class Node{
        private int data;
        private Node next;

        private Node(int data){
            this.data = data;
        }
        private void setData(int data){
            this.data = data;
        }
        private int getData(){
            return data;
        }
        //添加节点
        private void addNode(int data){
            if(this.next == null){
                this.next = new Node(data);
                countindex++;
            }else{
                this.next.addNode(data);
            }
        }
        //删除节点
        private void delNode(int data){
            if(this.next!=null){
                if(this.next.data == data){
                    this.next = this.next.next;
                    countindex--;
                }
                else{
                    this.next.delNode(data);
                }
            }
        }
        //输出所有节点
        private void printNode(){
            if(this.next!=null){
                System.out.print(this.next.data+"=>");
                this.next.printNode();
            }
        }
        //查找节点是否存在
        private boolean findNode(int data){
            if (this.next!=null) {
                if (this.next.data == data) return true;
                else if (this.next.findNode(data)) return true;
            }
            return false;
        }
        //修改节点
        private void updateNode(int olddata,int newdata){
            if(this.next.data == olddata){
                this.next.setData(newdata);
            }
            else{
                this.next.updateNode(olddata,newdata);
            }
        }
        //插入节点
        private void insertNode(int index,int data,int temp){
            if(index == temp){
                Node count = new Node(data);
                count.next = this.next;
                next = count;
            }else{
                temp++;
                this.next.insertNode(index,data,temp);
            }
        }
    }
}

代码解析:

编写外部类和内部类

首先我们编写一个外部类叫Nodewaibulei

class Nodewaibulei{

}

在外部类中再编写一个私有的内部类叫Node

class Nodewaibulei{
	private class Node{
	
	}
}

在内部类定义一个私有的int类型数据data
再定义一个私有的内部类类型的数据next
给内部类定义构造方法
给data编写get,set方法

private class Node{
	private int data;
	private Node next;
	
	private Node(int data){
		this.data = data;
	}
	private void setData(int data){
		this.data = data;
	}
	private int getData(){
		return data;
	}
}

在内部类再编写六个方法,分别是:
addNode() \t添加
delNode() 删除
findNode() 查
printNode() 输出所有
updateNode() 修改
insertNode() 插入

private class Node{
	private int data;
	private Node next;

	private void setData(int data){
		this.data = data;
	}
	private int getData(){
		return data;
	}
	private void addNode(int data){		//添加数据

	}
	private void delNode(int data){			//删除数据
	
	}
	private boolean findNode(int date){		//查询数据(返回boolean)
		return false;
	}
	private void printNode(){		//输出所有数据
	
	}
	private void updateNode(int olddate,int newdata){		//修改数据,olddata为原数据,newdata新数据

	}
	private void insertNode(int index,int data){	//插入数据,index插入索引位置

	}
}

内部类私有方法虽然外部类可以使用,但其他类中无法调用,所以在外部类中编写共有的方法
外部类中:

class Nodewaibulei{
	public void add(int data){

	}
	public void del(int data){

	}
	public boolean find(int data){
		return false;
	}
	public void print(){

	}
	public void update(int olddate,int newdata){

	}
	public void insert(int index,int data){

	}
}

在外部类中定义内部类类型的数据,这也叫根节点。

class Nodewaibulei{
	private Node root;
}

添加数据

咱们回到main方法中
先创建一个Nodewaibulei类
再用add方法添加一个数据

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	
}

此时add方法接收到一个参数,我们要判断链表根节点是否为null,

  1. 如果是,创建根节点并把参数直接赋给根节点
  2. 如果否,调用内部类中的addNode()方法
public void add(int data){
	if(root == null){
		root = new Node(data);
	}else{
		root.addNode(data);
	}
}
		咱们回到内部类中的addNode()方法中,

判断内部类中的next是否为空

  • 如果是,新建一个内部类,data数据赋给新类,并把新类赋给next
  • 如果否,调用next中的addNode()方法,并把参数递过去。
private void addNode(int data){
    if(this.next == null){
        this.next = new Node(data);
    }else{
        this.next.addNode(data);
    }
}

这里有点绕,next本身就是一个内部类类型的数据,每次创建一个新的内部类时,它都会定义一个空的内部类对象next。也就是说每添加一个数据,就会多出一个空的next,为下一次添加新值准备。

比如咱们添加第一个数据时,在外部类中给内部类类型的root 创建一个新的内部类,

public void add(int data){
	if(root == null){
		root = new Node(data);
	}else{
		root.addNode(data);
	}
}

因为是第一个数据,所以root为空,当我们给root创建新的内部类时,内部类就定义了两个参数,一个是int类型的数据data,另一个是内部类类型的next。
data是有构造方法,定义类时就得提供参数,而next就不需要,所以定义一个新的内部类,就得空出一个next;
那什么时候用next?就是又要新添加数据时,new一个新的内部类,并把它赋给next。当然了,new出来的内部类又会空出一个next;

	回过头来看一下内部类中的add方法,

判断next是否为空:

  • 如果是,新建一个内部类,data数据赋给新类,并把新类赋给next
  • 如果否,调用next中的addNode()方法,并把参数递过去。

添加数据完成。

private void addNode(int data){
    if(this.next == null){
        this.next = new Node(data);
    }else{
        this.next.addNode(data);
    }
}

输出所有数据

		我们回到main方法中

咱们通过add方法多加几个数据,然后通过print方法输出所有数据。

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	nwbl.add(9);
	nwbl.add(11);
	nwbl.add(13);
	nwbl.add(15);
	nwbl.print();	//输出所有数据
}
		我们回到外部类print方法中。

首先要判断根节点是否为空,也就是第一个数字是否为空

  • 如果否,就输出根节点(说明根节点有数据)
  • 调用内部类中的printNode方法(继续输出其他节点上的数据)
public void print(){
    if(root!=null){
        System.out.print(root.data+"=>");
        root.printNode();
        System.out.println();
    }
}
		内部类中的printNode方法:

判断内部类中的next是否为空

  • 如果否,输出该节点数据(说明该节点存在)
  • 继续调用next中的printNode方法,直到nex为空。

输出所有数据完成。

private void printNode(){
    if(this.next!=null){
        System.out.print(this.next.data+"=>");
        this.next.printNode();
    }
}

删除数据

		我们回到main方法中

通过del方法删除数据

public static void main(String[] args){
	Nodewaibulei nwbl = new Nodewaibulei();
	nwbl.add(10);
	nwbl.add(9);
	nwbl.add(11);
	nwbl.add(13);
	nwbl.add(15);
	nwbl.del(11);		//删除元素为11的数据。
}
		我们回到外部类del方法中。

判断参数是否跟根节点相同

  • 如果是,把第二个节点赋给第一个节点(根节点被覆盖,从而达到删除效果)
  • 如果否,调用内部类中delNode方法,并把参数传递过去。
public void del(int data){
    if(root.getData() == data){
        root = root.next;
        countindex--;
    }else{
        root.delNode(data);
    }
}
		内部类中的delNode方法

判断next是否为空,
如果否,再判断数据data跟参数data是否相等。

  • 如果是,把数据next中的下一个next赋给现在的next。
  • 如果否,继续调用next中的delNode()方法,并把参数传递过去。

删除数据完成。

private void delNode(int data){
    if(this.next!=null){
        if(this.next.data == data){
            this.next = this.next.next;
        }
        else{
            this.next.delNode(data);
        }
    }
}

其他几个方法也同样利用递归算法实现查找,插入,修改等操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单实现链表增删改查 的相关文章

  • 在java中将StreamWriter转换为OutputStream?

    我正在尝试使用 System setOut 将 System out 重定向到字符串 它需要一个 PrintStream 有什么方法可以将 StringWriter 转换为 Stream 以便我可以将其传递给 setOut 吗 你不能完全这
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • linux espidf vscode

    安装 根据 https docs espressif com projects esp idf zh CN latest esp32s2 get started linux macos setup html 里的要求安装一些东西 点插件的首
  • 数据分析方法论与前人经验总结【笔记干货】

    文章目录 一 数据的力量 二 获取数据 三 指标的建立 四 数据化运营 一 数据的力量 1 数据的重要性 在产品最早期 不需要太多数据 凭借创始人的直觉 产品经理的直觉 做决策占很大的比例 但是到后来的话 数据化运营就越来越重要了 一个人在
  • win7计算机不能设置双屏怎么回事,告诉你win7怎么设置双屏显示

    小伙伴们 小编今天要了给你们说一个非常炫酷的技能哟 那也就是win7系统下怎么设置双屏显示的方法 听到这儿 不知道小伙伴们有木有 小心脏扑通扑通的乱跳呢 有的话 那么想不想和小编一起来看看win7双屏显示的设置方法呢 想的话 那么事不宜迟这
  • yml配置文件成小方块如何恢复

    因为module太多 idea工具识别不了spring配置文件了 变成了小方块 project structure下 然后点击出现的小 号 然后就变成了小绿叶
  • 利用CNN进行面部表情识别

    本文是论文 Facial Emotion Recognition State of the Art Performance on FER2013 的复现 感谢原作者Yousif Khaireddin和Zhuofa Chen 本文采用的数据集
  • prometheus-02 docker搭建 prometheus+grafana监控 linux系统性能

    环境准备 linux上安装docker 如果你的机器上还没有安装docker可以参考这篇文章 在Linux系统安装配置docker docker拉取node exporter prometheus grafana镜像 命令如下 docker
  • js 调用 new ActiveXObject('WScript.Shell')报错

    当在网页中点击打印时 会报错 无法打印 解决方法如下 在浏览器中找到 Internet选项 在弹出的对话框中进行设置 Internet选项 gt 安全 gt 本地Intranet gt 自定义级别 gt ActiveX控件和插件 gt 对未
  • 比例均摊

    CREATE TABLE TEST01 VALUES1 VARCHAR2 10 VALUES2 VARCHAR2 10 VALUES3 VARCHAR2 10 INSERT INTO TEST01 VALUES 1 2 3 INSERT I
  • 最全4k,8k的高清壁纸网站免费下载

    极简壁纸 https bz zzzmh cn classify 部分壁纸展示 wallhaven https wallhaven cc wallpaper abyss https wall alphacoders com by resolu
  • 海外硕士"苏明哲"回国后哀叹:我美本英硕,找不到工作很难受

    推荐阅读 欢迎加入我们的架构师社群 阿里跳槽拼多多 80万年薪涨到160万 值不值得去 一名海外留学生回国后找工作 却屡受打击 感慨自己美本英硕 却找不到工作 内心真的很难受 如下便是其吐槽的个人经历 楼主馁本英硕 硕士50左右的学校 非技
  • Windows系统中如何标识一个卷(Volume)

    问题 从事数据存储底层工作的小伙伴们应该会关心以下两个问题 1 如何标识一个卷 2 新建了一个卷 以挂载文件夹的方式同时挂载到E abc和F def 此时这两个挂载点如何区分 解决方案 问题1 Windows系统提供两种方式来标识一个卷 用
  • 位运算及其应用

    文章目录 位运算基础知识 与 或 非 异或 进阶应用 lowbit 状态压缩 位运算基础知识 与 或 非 异或 进阶应用 lowbit 返回二进制数的最低位1的值 int LowBit int n return n n int GetBit
  • hover时效果从中间向两边扩散

    header nav gt li position relative display inline block margin right 20px padding 0 5px font size 16px line height 76px
  • P1433 吃奶酪 题解(勿抄袭)

    P1433 吃奶酪 题目描述 房间里放着 n 块奶酪 一只小老鼠要把它们都吃掉 问至少要跑多少距离 老鼠一开始在 0 0 点处 输入格式 第一行一个正整数 n 接下来每行 2 个实数 表示第i块奶酪的坐标 两点之间的距离公式为 输出格式 一
  • map获取最大值value和其对应的key

    public String getMaxStr Map
  • 光盘 显示0字符 无法读取文件的修复方法!!

    光盘 显示0字符 无法读取文件的修复方法 问题现象 光盘在运行中强制退出 再次重新读入时 无法读出其中内容 右键 gt 属性 可以看到可用空间和已用空间均为0 出错原因分析 光盘强制退出 未在光盘的引导区写入终止符 导致光盘损坏 解决方案
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • WINDOWS TE开发指南

    下载 gt 操作系统 gt Linux gt Tiny6410 WindowsCE开发指南 div class download l fl div class download top div class download top wrap
  • 实现Tomcat——实现javax.servlet.Servlet接口

    0 环境配置 这里使用IntelliJ IDEA Maven WebApp项目 不过这里我们不会使用 启动Tomcat服务器 本文的目的就是使用Socket实现一个服务器 此服务器是一个Servlet容器 我们需要遵循Servlet接口规范
  • 简单实现链表增删改查

    学习目标 简单实现链表增删改查 学习内容 外部类和内部类 封装方法 其他类使用内部类私有方法 递归算法 代码块 class test public static void main String args Nodelianbiao nlb