单链表的创建、增、删、改、查

双向链表的增删改查: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实现单链表的创建、增、删、改、查的更多相关文章

  1. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  2. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  3. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  4. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  5. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  6. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  7. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  8. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  9. Java操作MongoDB:连接&增&删&改&查

    1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...

随机推荐

  1. Linux 时间设置和同步服务

    修改日期时间的工具 date hwclock timedatectl date工具的使用 作用:显示和设置系统时间 选项: -d <字符串> 显示字符串所指的日期与时间,比如:" ...

  2. SElinux管理

    SElinux: 是Linux的一个强制访问控制的安全模块 SElinux的相关概念: 对象:文件.目录.进程.端口等 主体:进程称为主体 SElinux将所有的文件都赋予一个type类型的标签,所有 ...

  3. placeholder 设置字体颜色

    input::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } input:-moz-placeholder { col ...

  4. [GYCTF2020]Ezsqli-1|SQL注入

    1.打开界面之后在输入框进行输入测试,分别输入1.2.3.'等字符,结果如下: 2.看到bool(false)这里我想到了bool注入,因为之前做过这道题:https://www.cnblogs.co ...

  5. Luogu1038 神经网络 (拓扑排序)

    拓扑排序,裸的,水的. 第一发:题读错,输出错,输入错,到处错 \(\longrightarrow\) 40pts (excuse me ?) 第二发:漏了输入层特判 \(\longrightarro ...

  6. [HFCTF2020]EasyLogin-1|JWT身份伪造

    1.打开之后只有一个登陆界面和注册界面,右键检查发现app.js代码,结果如下: app.js代码如下: /** * 或许该用 koa-static 来处理静态文件 * 路径该怎么配置?不管了先填个根 ...

  7. 完全彻底的卸载MySQL5.7.35

    最开始接触计算机的时候关于MySQL卸载的这个问题,导致我重装了一次系统.就在今天我又遇到了同样的问题. Setp①: 想要安装新的数据库软件必须要先彻底且干净的删除掉以前的数据库. 第一步要做的是停 ...

  8. Linux之LVM逻辑卷管理

    LVM逻辑卷管理 LVM机制:PV物理卷,VG卷组,LV逻辑卷. --功能-- --物理卷管理-- --卷组管理-- --逻辑卷管理-- create(建立) pvcreate vgcreate lv ...

  9. VM虚拟机安装

    VM虚拟机安装 1.安装vm虚拟机软件 1.1 双击打开虚拟机文件 1.2 根据向导安装 下一步 安装好了 不要着急点完成在 安装目录中有许可证. 1.3激活操作 2.虚拟机原理简介 3. 新建虚拟机 ...

  10. 理解 Spring IoC 容器

    控制反转与大家熟知的依赖注入同理, 这是通过依赖注入对象的过程. 创建 Bean 后, 依赖的对象由控制反转容器通过构造参数 工厂方法参数或者属性注入. 创建过程相对于普通创建对象的过程是反向, 称之 ...