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

标签:java,单链,增删改查
0
投稿

猜你喜欢

  • Java语言读取配置文件config.properties的方法讲解

    2023-09-29 14:45:51
  • 快速理解Java设计模式中的组合模式

    2021-10-18 04:16:29
  • SpringBoot 实现动态添加定时任务功能

    2022-07-12 05:07:40
  • Redisson RedLock红锁加锁实现过程及原理

    2022-12-29 20:49:42
  • Servlet+JDBC实现登陆功能的小例子(带验证码)

    2021-05-29 03:04:25
  • Java 实战范例之员工管理系统的实现

    2023-03-31 08:09:33
  • Java操作MongoDB数据库的示例代码

    2023-11-23 04:15:51
  • Java毕业设计实战项目之宠物商城系统的实现流程

    2022-03-02 06:10:41
  • java微信红包实现算法

    2023-08-09 00:19:39
  • ThreadLocal使用案例_动力节点Java学院整理

    2021-06-08 09:57:15
  • Springboot POI导出Excel(浏览器)

    2022-07-08 18:41:17
  • android获取手机cpu并判断是单核还是多核

    2021-09-28 22:11:24
  • 浅谈java中BigDecimal的equals与compareTo的区别

    2023-09-02 07:20:22
  • java程序员常见的sql错误

    2021-11-06 22:24:14
  • 混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

    2022-06-18 14:36:41
  • Java线程池并发执行多个任务方式

    2023-08-14 16:26:03
  • 误将.idea文件提交至git后删除的操作方法

    2022-09-03 09:32:57
  • C#邮件定时群发工具Atilia用法实例

    2022-06-13 11:50:24
  • spring-boot使用AOP统一处理日志

    2023-06-09 05:12:35
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

    2023-08-19 17:32:33
  • asp之家 软件编程 m.aspxhome.com