目录
单链表的组成:
java中单链表的实现由两个类组成,分别是:
-
1.Node类(节点类)
public class Node {
//data域
public int age;
public String name;
//next域
public Node next;
这个类是用来存入数据的,类的属性中有data域和next域,data域顾名思义就是用来存入数据的,比如上图中data域中有age和name两个数据,而next域中用来存入一个Node的指针,用来指向下一个节点,这样两个节点就有了联系,这就是链表中的“链”,
-
2.SingleLinkedList类
这个类用来实现对链表的增删改查,展示等功能
单链表的实现:
首先我们对Node类进行处理,重写构造函数,重写toString方法(为了更方便的展示),代码如下:
package linkedlist;
public class Node {
//data域
public int age;
public String name;
//next域
public Node next;
//构造器
public Node(int age, String name) {
this.age = age;
this.name = name;
}
//为了显示方便,重写toString()方法
@Override
public String toString() {
return "Node{" +
"age=" + age +
", name='" + name +
"'}";
}
}
其次是SingleLinkedList类的实现,首先初始化一个头节点,这个头节点不能动,否则会导致整个链表的丢失,因为每次对链表的访问都需要通过一个辅助变量temp从头节点开始,通过循环依次访问,在循环中对一个节点中的数据进行操作后,都需要有temp = temp.next,这样才能遍历链表。
public class SingleLinkedList {
//这个类用来管理节点
//先初始化一个头节点,头节点不能动,否则会导致整个链表丢失
private Node head = new Node(0, " ");
接下来是单链表的增删改查功能
-
add
(这里是加到链表的最末尾,如果想要加到特定位置,可以参考删除链表元素中的代码)
要向往链表的末尾加入节点,首先我们得找到这个链表的结尾,在链表的最后一个节点,它的next域是指向空指针的,依据这个特点,我们通过遍历链表,找到节点的next域为空指针的节点,则此节点就是链表的末尾,之后再将末尾节点的next域指向想要添加的节点即可,代码如下:
public void add(Node node) {
/*我们怎么去向一个单链表的末尾中添加节点呢?
假设我们现在已有一个单链表了,既然我们要向其末尾加入一个节点,
我们肯定要找到这个链表的末尾,怎么去找到这个链表的末尾呢?
这里我们通过一个辅助变量来遍历这个节点,因为头节点是不能动的
*/
Node temp;
temp = head;
while (true) {
if (temp.next != null) {
temp = temp.next;
} else {
temp.next = node;
break;
}
}
}
-
del
删除节点方法中需要匹配想要删除的节点,同时注意空指针异常的问题
//删除链表中元素
//传入参数为想要删除的节点的data域,是为了匹配到想要删除的节点
public void delNode(int _age, String _name) {
Node temp;
temp = head;
while (true) {
if (temp.next.age == _age && temp.next.name.equals(_name)) {
//条件匹配,找到想要删除的节点
temp.next = temp.next.next;
break;
} else {
temp = temp.next;
/*
以下if语句是判断当没有匹配到想要删除的节点时的操作
这里直接判断temp.next是否为空,为空就直接表示没有找到想要的删除的节点,
不需要再判断temp指向的节点是否匹配想要删除的节点了,
因为在这次的if_else中,if已经对最后一个节点进行检查过了,而且是不匹配才会转到else语句的
*/
if (temp.next == null) {
System.out.println("没有找到想要删除的节点");
break;
}
}
}
}
-
modify
//改动链表中元素
//传入参数为想要改动的节点和改动后的节点的data域
public void modifyNode(int age, String name, int _age, String _name) {
Node temp;
temp = head;
while (true) {
if (temp.next.age == age && temp.next.name.equals(name)) {
temp.next.age = _age;
temp.next.name = _name;
break;
} else {
temp = temp.next;
//与delNode()方法相同道理
if (temp.next == null) {
System.out.println("没有找到想要修改的节点");
break;
}
}
}
}
-
check
//查找节点,有则返回true,无则false
public boolean checkNode(int age, String name) {
Node temp;
temp = head;
while (true) {
if (temp.next.age == age && temp.next.name.equals(name)) {
return true;
} else {
temp = temp.next;
//与delNode()方法相同道理
if (temp.next == null) {
return false;
}
}
}
}
-
show
public void show() {
Node temp;
temp = head;
while (true) {
if (temp.next == null) {
System.out.println(temp);
break;
} else {
System.out.println(temp);
temp = temp.next;
}
}
System.out.println();
}
单链表的测试:
package linkedlist;
public class Main {
public static void main(String [] args){
Node first = new Node(10,"first");
Node second = new Node(20,"second");
Node third = new Node(30,"third");
SingleLinkedList test = new SingleLinkedList();
test.add(first);
test.add(second);
test.add(third);
test.show();
test.modifyNode(10,"first",100,"first_1");
test.show();
if(test.checkNode(20,"second")){
System.out.println("存在此节点");
};
}
}