java实现单链表的创建、增、删、改、查
单链表的创建、增、删、改、查
双向链表的增删改查:https://blog.csdn.net/weixin_43304253/article/details/119761865
 单链表:单链表中的每个节点不仅包含储存的数据,还包含指向下一个节点的链接。
 
定义节点:
//定义节点
class Node {
    public Node next;//指向下一个新的节点
    int val;
    public Node(int val) {//通过构造函数赋值
        this.val = val;
    }
}
1、增加一个节点
1、新创建一个节点

- 2、将cur的next指向pre的next

 - 3、将pre的next指向cur

 
    //按照顺序插入元素
    public void addOrder(Node node) {
        Node temp = head;
        //寻找插入的位置
        while (true) {
            //1、链表为空、直接在链表尾部插入
            if (temp.next == null) {
                temp.next = node;
                return;
            }
            //2、需要找到插入点的前一个节点,
            if (temp.next.val >= node.val) {
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }
    }
直接在链表尾部添加节点:只需要遍历到链表的最后,将next指向新的节点就可。
 代码实现
    //在链表尾增加节点
    public void add(Node node) {
        //1、设置辅助节点
        Node temp = head;
        //2、找到链表的最后
        while (true) {
            if (temp.next != null) {
                temp = temp.next;
            } else {
                break;
            }
        }
        //3、找到最后,插入
        temp.next = node;
    }
2、删除一个节点
- 1、找到待删除元素的上一个节点以及下一个节点

 - 2、通过遍历找到待删除元素的前一个节点,通过将前一个节点的指向指向当前节点的下一个节点

代码实现 
 //删除某一个节点
    public void deleteLinkList(int num) {
        Node temp = head;
        boolean flag = false;//标志位
        while (!flag) {
            if (temp.next == null) {
                System.out.println("链表中不存在待删除元素0");
                return;
            }
            if (temp.next.val == num) {
                System.out.println("找到了待删除数据:" + temp.next.val);
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;
        }
    }
3、修改某一个节点
通过遍历找到需要修改的节点,修改数据
 //修改节点
    public void upDateLinkList(int data, int num) {
        Node temp = head;//辅助数组
        while (true) {
            if (temp.next == null) {
                System.out.println("链表为空");
                return;
            }
            if (temp.next.val == data) {
                //修改新元素
                temp.next.val = num;
              return;
            }
            temp = temp.next;
        }
    }
4、查询某一个节点
 和修改节点相似
   //取得某一个节点
    public void getLinkList(int num) {
        Node temp = head;
        while (true) {
            if (temp.next == null) {
                System.out.println("链表中不存在该元素");
                return;
            }
            if (temp.next.val == num) {
                System.out.println("找到了该元素:" + temp.next.val);
                break;
            }
            temp = temp.next;
        }
    }
5、遍历单链表
通过辅助数组,遍历到每一个节点,打印链表存储的数值
   //遍历节点
    public void show() {
        Node temp = head.next;
        if (head.next == null) {
            return;
        }
        System.out.print("单链表为:[ ");
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.print(temp.val + "、");
            temp = temp.next;
        }
        System.out.println(" ]");
    }
}
举例:头节点设定为链表的开始,所有的节点连接在后边
package com.zheng.demo1;
public class MySingleLinkList {
    public static void main(String[] args) {
        //创建节点
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(8);
        //创建链表
        SingleLinkList singleLinkList = new SingleLinkList();
        singleLinkList.add(node1);
        singleLinkList.add(node2);
        singleLinkList.add(node3);
        singleLinkList.add(node4);
        singleLinkList.add(node5);
        System.out.println("添加数据后的节点:");
        singleLinkList.show();
        singleLinkList.getLinkList(3);//查找
        singleLinkList.deleteLinkList(4);
        System.out.println("删除数据4后的链表:");
        singleLinkList.show();
        //修改
        System.out.println("将数据为2的节点的值修改为22");
        singleLinkList.upDateLinkList(2, 22);
        System.out.println("修改后的节点信息:");
        singleLinkList.show();
//        //创建链表2
//        System.out.println("==================");
//        SingleLinkList singleLinkList1 = new SingleLinkList();
//        singleLinkList1.addOrder(node4);
//        singleLinkList1.addOrder(node3);
//        singleLinkList1.addOrder(node1);
//        singleLinkList1.addOrder(node2);
//        singleLinkList1.addOrder(node5);
//        singleLinkList1.show();
    }
}
class SingleLinkList {
    //构造一个头节点
    private Node head = new Node(0);
    //增加节点
    public void add(Node node) {
        //1、设置辅助节点
        Node temp = head;
        //2、找到链表的最后
        while (true) {
            if (temp.next != null) {
                temp = temp.next;
            } else {
                break;
            }
        }
        //3、找到最后,插入
        temp.next = node;
    }
    //删除某一个节点
    public void deleteLinkList(int num) {
        Node temp = head;
        boolean flag = false;//标志位
        while (!flag) {
            if (temp.next == null) {
                System.out.println("链表中不存在待删除元素0");
                return;
            }
            if (temp.next.val == num) {
                System.out.println("找到了待删除数据:" + temp.next.val);
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;
        }
    }
    //取得某一个节点
    public void getLinkList(int num) {
        Node temp = head;
        while (true) {
            if (temp.next == null) {
                System.out.println("链表中不存在该元素");
                return;
            }
            if (temp.next.val == num) {
                System.out.println("找到了该元素:" + temp.next.val);
                break;
            }
            temp = temp.next;
        }
    }
    //修改节点
    public void upDateLinkList(int data, int num) {
        Node temp = head;//辅助数组
        while (true) {
            if (temp.next == null) {
                System.out.println("链表为空");
                return;
            }
            if (temp.next.val == data) {
                //修改新元素
                temp.next.val = num;
              return;
            }
            temp = temp.next;
        }
    }
    //按照顺序插入元素
    public void addOrder(Node node) {
        Node temp = head;
        //寻找插入的位置
        while (true) {
            //1、链表为空、直接在链表尾部插入
            if (temp.next == null) {
                temp.next = node;
                return;
            }
            //2、需要找到插入点的前一个节点,
            if (temp.next.val >= node.val) {
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }
    }
    //遍历节点
    public void show() {
        Node temp = head.next;
        if (head.next == null) {
            return;
        }
        System.out.print("单链表为:[ ");
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.print(temp.val + "、");
            temp = temp.next;
        }
        System.out.println(" ]");
    }
}
//定义节点
class Node {
    public Node next;//指向下一个新的节点
    int val;
    public Node(int val) {//通过构造函数赋值
        this.val = val;
    }
}

实例二、单链表存储学生的信息
package com.zheng.demo2;
public class MyTest {
    public static void main(String[] args) {
        //定义节点
        Student student1 = new Student(1, "小明", "男");
        Student student2 = new Student(2, "小红", "女");
        Student student3 = new Student(3, "小黑", "男");
        Student student4 = new Student(4, "小青", "女");
        //2、初始化链表
        LinkList linkList = new LinkList();
        linkList.addStudent(student1);
        linkList.addStudent(student2);
        linkList.addStudent(student3);
        linkList.addStudent(student4);
        //遍历
        linkList.queryLinkList();
    }
}
class LinkList {
    //定义链表的开始位置
    private Student head = new Student(0, "", "");
    //增加节点,从尾部
    public void addStudent(Student student) {
        Student temp = head;//辅助数组
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                flag = true;
                break;
            } else {
                temp = temp.next;
            }
        }
        if (flag) {
            temp.next = student;
        }
    }
    //遍历
    public void queryLinkList() {
        Student temp = head;
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        while (true) {
            if (temp.next == null) {
                return;
            }
            System.out.println(temp.next);
            temp = temp.next;
        }
    }
}
//定义一个学生信息的节点类
class Student {
    int id;//学号
    String name;//姓名
    String sex;//性别
    Student next;//下一个学生的节点
    public Student(int id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
测试结果
 
java实现单链表的创建、增、删、改、查的更多相关文章
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
		
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
 - iOS FMDB的使用(增,删,改,查,sqlite存取图片)
		
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
 - iOS sqlite3 的基本使用(增 删 改 查)
		
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
 - django ajax增 删 改 查
		
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
 - ADO.NET 增 删 改 查
		
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
 - MVC EF 增 删 改 查
		
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
 - python基础中的四大天王-增-删-改-查
		
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
 - django单表操作 增 删 改 查
		
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
 - Java操作MongoDB:连接&增&删&改&查
		
1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...
 
随机推荐
- 【原创】Python 使用jmpy模块加密|加固 python代码
			
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 使用jmpy模块 将py文件加密为so或 ...
 - RPM方式安装GreatSQL 8.0.25-16
			
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 一.系统信息 1.确认OS信息 2.OS优化调 ...
 - vue2与vue3实现响应式的原理区别和提升
			
区别: vue2.x: 实现原理: 对象类型:Object.defineProperty()对属性的读取,修改进行拦截(数据劫持): 数组类型:通过重写更新数组的一系列方法来进行拦截(对数组的变更方法 ...
 - CDO如何盘点算法、推动算法业务增长
			
在数字经济时代,算法对企业业务增长至关重要,是企业进行数字化转型.构建竞争优势的关键.IT工程师或数据分析师可能会将算法描述为一组由数据操作形成的规则.而从业务价值方面考虑,算法是一种捕获商业机会.提 ...
 - Java开发学习(二十四)----SpringMVC设置请求映射路径
			
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
 - 使用Linux、Nginx和Github Actions托管部署ASP.NET Core 6.0应用
			
使用Linux.Nginx和Github Actions托管部署ASP.NET Core 6.0应用 前言 本文主要参考微软这篇文档而来 Host ASP.NET Core on Linux with ...
 - 【Django】DRF开发中的一些技巧记录
			
问题记录 问题1:信号没有按预期触发 描述 编写了信号函数后,并没有如预期一般在必要时候触发,函数如下: @receiver(signals.post_save, sender=Prometheus) ...
 - scp复制发送文件夹到其他服务器上
			
简述scp: scp是secure copy的简写,是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 写法: scp [可选参数] 登录名@地址:源路径 目标路径. 举例:scp -r ...
 - 【读书笔记】C#高级编程 第十五章 反射
			
(一)在运行期间处理和检查代码 自定义特性允许把自定义元数据与程序元素关联起来.反射是一个普通术语,它描述了在运行过程中检查和处理程序元素的功能.例如,反射允许完成的任务: 枚举类型的成员 实例化新对 ...
 - Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。
			
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...