链表 Linked List
链表是有序的列表。
1、单向链表
实际结构:
逻辑结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRMqG0ed-1627263118581)(C:\Users\松鼠打不赢仓鼠\AppData\Roaming\Typora\typora-user-images\image-20210715104550445.png)]
package msp.cai.linkedlist;
/*
* 单向链表
* 使用链表存储数据
*/
public class SingleLinkedListDemo {
public static void main(String[] args) {
SingleLinkedList linkedList = new SingleLinkedList();
System.out.println("== 添加节点 ==");
linkedList.addToList(new Node(1, "宋江"));
linkedList.addToList(new Node(2, "林冲"));
linkedList.addToList(new Node(3, "鲁智深"));
linkedList.showList();
System.out.println("== 修改节点 ==");
linkedList.updateNode(new Node(3,"傻逼"));
linkedList.showList();
System.out.println("== 删除节点 ==");
linkedList.deleteNode(3);
linkedList.showList();
}
}
class SingleLinkedList {
// 头节点,指定链表开始的位置,不存放数据
private Node head = new Node(0,"");
// 按照id顺序,添加数据
public void addToList(Node node) {
// 因为head节点不能动,所以需要一个辅助节点
Node temp = head;
boolean flag = false; // 用于标识待插入的节点是否存在
while (true) {
if (temp.next == null) // 最后一个节点
break;
else {
if (temp.next.id > node.id) // 找到待插入的位置
break;
else if (temp.next.id == node.id) { // 链表中已存在该节点
flag = true;
break;
}
}
temp = temp.next; // 遍历
}
// 退出循环后,在temp节点后面插入即可
if (flag) {
System.out.println("链表中已存在该节点-->" + node.id + ", " + node.name);
} else {
// 1. node --> temp.next
// 2. temp --> node
node.next = temp.next;
temp.next = node;
}
}
// 删除节点
public void deleteNode(int id) {
// 1. 找到该节点的上一个节点
Node temp = head;
boolean flag = true; // 该节点是否存在
while (true) {
if (temp.next == null) {
flag = false;
break;
}else {
if (temp.next.id == id) // 找到了
break;
}
temp = temp.next;
}
// 2. 将其上一个节点指向其下一个节点
if (flag) {
temp.next = temp.next.next;
System.out.println("删除成功~ --> " + id);
} else {
System.out.println("该节点不存在,无法删除~ --> " + id);
}
}
// 修改节点
public void updateNode(Node node) {
// 1. 遍历,找到该节点
Node temp = head;
boolean flag = true; // 标识是否找到该节点
while (true) {
if (temp.next == null) {
flag = false;
break;
} else {
if (temp.next.id == node.id) {
// 2. 修改节点
temp.next.name = node.name;
System.out.println("修改成功~~~");
break;
}
}
temp = temp.next;
}
if (!flag)
System.out.println("该节点不存在,无法修改~~~-->" + node.id);
}
// 打印链表
public void showList() {
System.out.println("链表中的数据:");
System.out.println(head);
}
}
// 节点类
class Node {
public int id; // 名次
public String name; // 姓名
public Node next; // 下一个节点
public Node(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", name='" + name + '\'' +
", next=" + next +
'}';
}
}
2、双向链表
遍历:
- 前 --> 后
- 后 --> 前
删除:
- 可以实现自我删除
temp.pre.next = temp.next
temp.next.pre = temp.pre
3、单项环形链表
啊