一、介绍
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
二、代码
我们创建节点Node
class Node {
public int no;
public String data;
public Node next;
public Node(int no, String data) {
this.no = no;
this.data = data;
}
// 为了显示方便 我们重写toString
@Override
public String toString() {
return "Node{" +
"no=" + no +
", data='" + data + '\'' +
'}';
}
}
我们创建SingleLinkedList
class SingleLinkedList {
// 初始化头节点 并不存放具体数据
private Node head = new Node(0, "");
// 添加结点到单向链表
public void add(Node node) {
// 因为head节点不能动 因此我们需要一个辅助节点
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
System.out.printf("编号%d:插入成功\n", node.no);
}
// 插入节点到单向链表
public void addByOrder(Node node) {
// 因为头节点不能动 我们通过辅助节点帮助找到插入的位置
Node temp = head;
boolean flag = false; // 添加编号是否存在默认false
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no > node.no) {
break;
} else if (temp.next.no == node.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("添加的编号已经存在");
} else {
node.next = temp.next;
temp.next = node;
System.out.printf("编号%d:插入成功\n", node.no);
}
}
// 遍历链表
public void show() {
if (head.next == null) {
System.out.println("链表为空,无法遍历");
return;
}
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp.toString());
temp = temp.next;
}
}
// 更新节点
public void update(Node node) {
if (head.next == null) {
System.out.println("链表为空,无法更改");
return;
}
Node temp = head.next;
boolean flag = false; // 添加编号是否存在默认false
while (true) {
if (temp.next == null) {
break;
}
if (temp.no == node.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.data = node.data;
System.out.printf("编号%d:修改成功\n", temp.no);
} else {
System.out.println("更改节点编号不存在");
}
}
// 删除节点
public void delete(int no) {
if (head.next == null) {
System.out.println("链表为空,无法删除");
return;
}
boolean flag = false;
Node temp = head.next;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
System.out.printf("编号%d:删除成功\n", no);
} else {
System.out.println("删除节点编号不存在");
}
}
}
三、测试
public class SingleLinkedListTest {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(new Node(0, "test0"));
singleLinkedList.add(new Node(1, "test1"));
singleLinkedList.add(new Node(3, "test3"));
singleLinkedList.show();
singleLinkedList.addByOrder(new Node(2, "test2"));
singleLinkedList.show();
singleLinkedList.delete(2);
singleLinkedList.show();
singleLinkedList.update(new Node(1, "test2"));
singleLinkedList.show();
}
}