- 除了尾部添加的方式,其他的增删改都需要找到前一个节点进行操作。
- 在有头结点的链表中,头节点不能改变。
// 定义一个链表管理节点
class SingleLinkedList {
private Node headNode = new Node(0,"head");
// 1、尾部添加
public void add(Node node){
// 由于不能修改头节点,创建临时节点
Node temp = headNode;
while (true){
if(temp.next == null) break; // 当节点的下一个节点为空时,说明该节点是尾部节点
temp = temp.next;
}
temp.next = node;
}
// 2、遍历链表
public void list(){
if(headNode.next == null){
System.out.println("链表为空~");
return;
}
Node temp = headNode;
while (true){
if(temp.next == null) break; // 节点到达最后,跳出循环
System.out.println(temp.next);
temp = temp.next;
}
}
// 3、按顺序插入节点
public void addByOrder(Node node){
/**
* 要想按顺序插入,首先需要找到插入位置的前一个节点
* 1、头节点的next为空,直接插入
* 2、找到中间插入位置
* 3、链表遍历完也没找到插入位置,在最后插入
* 4、节点已存在,插入失败
* 1 和 3的条件是一样的,都是节点的next为空
*/
Node temp = headNode;
while (true){
if(temp.next == null) break; // 说明链表为空或者已经遍历到链表尾部,直接跳出循环,在temp后添加节点即可
if(temp.next.no > node.no){ // 按从小到大排列,temp后面的节点比插入节点的编号大,则已找到位置
break;
} else if(temp.next.no == node.no){
System.out.println("节点已存在,插入失败"); //节点已存在,插入失败,直接返回
return;
}
temp = temp.next;
}
node.next = temp.next;
temp.next = node;
}
// 4、修改节点 -- 根据编号修改
public void update(Node updateNode){
Node temp = headNode.next;
while (true){
if(temp == null){
break;
}
if(temp.no == updateNode.no){
temp.value = updateNode.value;
System.out.println("编号为" + updateNode.no + "的节点数据修改成功!");
return;
}
temp = temp.next;
}
System.out.println("没有找到编号为" + updateNode.no + "的节点,修改失败!");
return;
}
// 5、删除节点
public void delete(Node node){
Node temp = headNode;
while (true){
if(temp.next == null){
break;
}
if(temp.next.no == node.no){
temp.next = node.next;
System.out.println("编号为" + node.no + "的节点删除成功!");
return;
}
temp = temp.next;
}
System.out.println("没有找到编号为" + node.no + "的节点,删除失败!");
return;
}
}
class Node{
public int no; // 编号
public String value; // 节点数据
public Node next; // 下一个节点
public Node(int no, String value){
this.no = no;
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", value='" + value + '\'' +
'}';
}
}
测试代码:
public class Test {
public static void main(String[] args){
// 单链表
Node node1 = new Node(1,"liubei");
Node node2 = new Node(2,"guanyu");
Node node3 = new Node(3,"zhangfei");
Node node4 = new Node(4,"machao");
Node node5 = new Node(4,"huangzhong");
Node node6 = new Node(5,"kongming");
SingleLinkedList singleLinkedList = new SingleLinkedList();
// 添加
singleLinkedList.addByOrder(node3);
singleLinkedList.addByOrder(node1);
singleLinkedList.addByOrder(node4);
singleLinkedList.addByOrder(node2);
// 修改
singleLinkedList.update(node6);
// 删除
singleLinkedList.delete(node6);
singleLinkedList.list();
}
}