Java如何实现单链表的增删改查

时间:2022-11-09 19:21:36

一、新建学生节点类

Stu_Node节点包含:

学号:int num;

姓名:String name;

性别:String gender;

下一个节点:Stu_Node next;

为了便于打印节点内容需要重写toString方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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>创建链表的实现类对象

?
1
2
3
class SingleLinkedList{
 
}

2>在类里实现尾结点添加链表节点方法

1、定义一个头结点head为空。

2、定义一个节点变量temp等于头结点head。

3、遍历链表找到尾结点。

while循环,结束的标志是temp的下一个节点为空,此时终止while(否则程序会陷入死循环),循环每进行一次要把temp节点的下一个节点赋值给temp变量(否则程序会陷入死循环)。

4、使temp节点的下一个节点指向新增的节点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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节点的下一节点指向带插入节点。(画图方便理解,图自行脑补)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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的下一节点)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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为假表示未找到当前节点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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为假代表找不到待删除的节点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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、使用新建的链表操作类对象进行增删改查功能

完整代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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单链增删改查内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/cly_32/article/details/115485837