当前位置:
首页
文章
后端
详情

详解使用Java实现单链表的增删改查

学习一门语言必不可少要学习数据结构,如数组、链表、栈等等。学习这些数据结构,就要学习相应的结构操作,例如增删改查等等。本文将为大家介绍如何使用Java语言来实现单链表的增删改查。

一、新建学生节点类

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("未找到要删除的链表");
        }

    }
}

总结

到此这篇关于 Java 如何实现单链表增删改查的文章就介绍到这了,想要了解更多 Java 关于其他数据结构的增删改查内容请搜索W3Cschool以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统