Java中怎么对单链表进行增删改查操作

发布时间:2021-06-22 17:35:04 作者:Leah
来源:亿速云 阅读:138

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](https://my.oschina.net/u/1162528)
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](https://my.oschina.net/u/1162528)
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中怎么对单链表进行增删改查操作问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. 单链表逆序操作
  2. 单链表的环操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java中 matches() 方法的作用是什么

下一篇:React Hooks 在 SSR 模式下有哪些常见问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》