Java如何实现单链表的增删改查
作者:起个花名好难 发布时间:2021-09-19 09:49:25
一、新建学生节点类
Stu_Node节点包含:
学号:int num;
姓名:String name;
性别:String gender;
下一个节点:Stu_Node next;
为了便于打印节点内容需要重写toString方法
class Stu_Node{
int num;
String name;
String gender;
Stu_Node next;
@Override
public String toString() {
return "Stu_Node{" +
"num=" + num +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
public Stu_Node(int num, String name, String gender){
this.num=num;
this.name=name;
this.gender=gender;
}
}
二、新建一个操作链表的类,实现增删改查方法
1>创建链表的实现类对象
class SingleLinkedList{
}
2>在类里实现尾结点添加链表节点方法
1、定义一个头结点head为空。
2、定义一个节点变量temp等于头结点head。
3、遍历链表找到尾结点。
while循环,结束的标志是temp的下一个节点为空,此时终止while(否则程序会陷入死循环),循环每进行一次要把temp节点的下一个节点赋值给temp变量(否则程序会陷入死循环)。
4、使temp节点的下一个节点指向新增的节点。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//链表的尾节点添加方法
public void add(Stu_Node node){
Stu_Node temp = head;
while(true){
if (temp.next==null){
break;
}
temp = temp.next;
}
temp.next=node;
}
}
按学号顺序插入节点
1、新建临时节点temp
2、新建boolean变量flag用于找到当前带插入节点的位置
3、while循环遍历链表找到插入节点位置,如果temp的下一节点为空表示链表已经遍历完毕此时终止循环;如果temp的下一节点的学号等于要插入的节点学号,此时将flag变量赋值为true结束循环(带插入的节点已经存在插入失败);如果temp节点的下一节点的学号大于带插入节点的学号,此时temp下一节点指向的位置就是要插入的位置。每次链表遍历一次节点要将temp的下一节点赋值给temp节点避免死循环。
4、如果flag为真表示,要插入的节点已经存在,输出插入失败;如果flag为假,令插入节点的下一节点指向temp的下一节点,temp节点的下一节点指向带插入节点。(画图方便理解,图自行脑补)
public void addOrder(Stu_Node node){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num >node.num){
break;
}
else if (temp.next.num==node.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("插入失败");
}
else{
node.next=temp.next;
temp.next=node;
}
}
3>打印链表
1、判断头结点的下一个节点是否为空,如果为空输出链表为空。
2、定义一个temp节点变量,将头结点的指向的节点赋值给temp。
3、遍历链表打印节点数据。
while循环,打印链表节点,每打印一次temp节点,使temp节点的下一节点赋值给temp避免程序陷入死循环,循环结束标志是temp的节点为空(因为temp节点是头结点head的下一节点)。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//打印单链表
public void print(){
if (head.next==null){
System.out.println("链表为空");
}
Stu_Node temp = head.next;
while(true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
4>修改链表中的数据(假设学号为维一值)
1、首先判断链表是否为空
2、定义一个临时变量temp将头结点赋值给temp
3、定义一个Boolean变量flag用于判断链表中是否存在要修改的节点。
4、遍历链表,while循环查询要修改的节点,每查询一次就将temp变量赋值为temp的next节点,如果查询到要修改的节点将flag变量赋值为真、终止while循环,如果temp的下一节点为空表示未找到要修改的节点变量,此时也终止循环。
5、判断flag值为真代表找到当前要修改的节点,将要新的节点的值赋值给要修改节点的值;如果flag为假表示未找到当前节点。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//链表的修改方法
public void update(Stu_Node newnode){
if (head.next==null){
System.out.println("链表为空");
}
Stu_Node temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}
if (temp.num== newnode.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
temp.name=newnode.name;
temp.gender= newnode.gender;
}
else
System.out.println("当前节点不存在,无法修改!");
}
}
5>依据学号删除节点
1、定义一个临时节点temp,将头结点赋值给temp
2、定义一个boolean型变量flag用于判断是否找到当前链表中待删除的节点
3、while循环遍历当前链表,每遍历一次节点,将temp节点的下一节点赋值给temp避免循环,如果待删除节点的学号跟要删除的节点的学号一至,将flag赋值为true终止while循环,否则持续遍历链表直到temp节点的下一节点为空终止循环。
4、如果flag为真,代表找到当前要删除的节点,将temp的下一节点指向temp下一节点的下一节点。,如果flag为假代表找不到待删除的节点。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//删除链表的节点
public void delete(int no){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num==no){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next=temp.next.next;
}
else{
System.out.println("未找到要删除的链表");
}
}
}
三、新建操作链表类的实现类实现其增删改查功能
1、新建操作链表类的实现类对象
2、新建多个待操作的节点
3、使用新建的链表操作类对象进行增删改查功能
完整代码如下:
public class linkedlist {
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
Stu_Node node1 = new Stu_Node(1903210086,"小明","男");
Stu_Node node2 = new Stu_Node(1903210087,"小花","女");
Stu_Node node3 = new Stu_Node(1903210088,"小黄","男");
Stu_Node node4 = new Stu_Node(1903210089,"小翠","女");
list.add(node1);
list.add(node4);
list.add(node3);
list.add(node2);
list.print();
System.out.println("----------------------");
System.out.println("按学号顺序插入节点");
SingleLinkedList list_1= new SingleLinkedList();
list_1.addOrder(node1);
list_1.addOrder(node4);
list_1.addOrder(node3);
list_1.addOrder(node2);
list_1.print();
System.out.println("-----------------------");
Stu_Node node5 = new Stu_Node(1903210089,"贾明","男");
list.update(node5);
list.print();
System.out.println("#######################");
System.out.println("删除之后的链表");
list.delete(1903210088);
list.print();
}
}
class Stu_Node{
int num;
String name;
String gender;
Stu_Node next;
@Override
public String toString() {
return "Stu_Node{" +
"num=" + num +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
public Stu_Node(int num, String name, String gender){
this.num=num;
this.name=name;
this.gender=gender;
}
}
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//链表的尾节点添加方法
public void add(Stu_Node node){
Stu_Node temp = head;
while(true){
if (temp.next==null){
break;
}
temp = temp.next;
}
temp.next=node;
}
public void addOrder(Stu_Node node){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num >node.num){
break;
}
else if (temp.next.num==node.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("插入失败");
}
else{
node.next=temp.next;
temp.next=node;
}
}
public void print(){
if (head.next==null){
System.out.println("链表为空");
}
Stu_Node temp = head.next;
while(true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
public void update(Stu_Node newnode){
if (head.next==null){
System.out.println("链表为空");
}
Stu_Node temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}
if (temp.num== newnode.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
temp.name=newnode.name;
temp.gender= newnode.gender;
}
else
System.out.println("当前节点不存在,无法修改!");
}
public void delete(int no){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num==no){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next=temp.next.next;
}
else{
System.out.println("未找到要删除的链表");
}
}
}
总结
来源:https://blog.csdn.net/cly_32/article/details/115485837
猜你喜欢
- 调用方法:/** * 点击量/月(年)Callable */ public void yearlyClickCallable() { //
- 为了学习数据库,重装了系统,之前前一直在用eclipse,现在准备换成myeclipse,这之前当然需要重新设置环境变量,顺手写下有关jdk
- 1. IOC和DI首先,我们应该明确,IOC是一种思想,并不是Spring特有的,而是软件工程逐步发展的一种产物,是一种优秀的编程思想,之所
- 本文实例讲述了Java基于Runtime调用外部程序出现阻塞的解决方法, 是一个很实用的技巧。分享给大家供大家参考。具体分析如下:有时候在j
- 最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1. 
- springboot结合maven配置不同环境的profile1、在spring-boot中新建配置文件spring-boot不同环境配置文
- 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件
- 文章按照 Socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。一,网络基础说到 Socket,需要学习一下
- 一、项目创建创建一个控制台应用程序,项目右键->管理 NuGet 程序包->Topshelft及Topshelf.Log4Net
- @Validated和BindingResult 使用遇到的坑@Validated 与BindingResult 需要相邻,否则 变量res
- 1、static是什么意思?static 关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。例如Main类pa
- SpringMVC中的 * 用于拦截控制器方法的执行,执行在Controller前后,和视图渲染完成后。如下图所示:一、创建 * 继承Han
- 前言:2022年Java将有什么新的特性和改进,我相信很多Java开发者都想知道。结合Java语言架构师布莱恩·格茨(
- json数据交互1.为什么要进行json数据交互json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。比
- # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了# 先看代码:public class Common {public static
- 本文实例讲述了Java开发之spring security实现基于MongoDB的认证功能。分享给大家供大家参考,具体如下:spring s
- 本文实例讲述了C#实现winform中RichTextBox在指定光标位置插入图片的方法。分享给大家供大家参考,具体如下://获取RichT
- 本文实例讲述了Java上传文件进度条的实现方法。分享给大家供大家参考,具体如下:东西很简单,主要用到commons-fileupload,其
- dataGridView动态绑定数据1.动态绑定DataTable数据DataGridView dgv = new DataGridView
- 传统的Trie实现简单,但是占用的空间实在是难以接受,特别是当字符集不仅限于英文26个字符的时候, * 起来的空间根本无法接受。双数组Trie