/**
* @program: DataSructure
* @description:
* @author: stone
* @create: 2021-09-11 09:29
**/
public class SinglyLinkedListDome {
public static void main(String[] args) {
SinglyLinkedList singlyLinkedList = new SinglyLinkedList();
PersonNode personNode1 = new PersonNode(1, "张三", 30);
PersonNode personNode2 = new PersonNode(2, "李四", 31);
PersonNode personNode3 = new PersonNode(3, "王五", 32);
singlyLinkedList.addByOrder(personNode2);
singlyLinkedList.addByOrder(personNode1);
singlyLinkedList.addByOrder(personNode3);
singlyLinkedList.list();
singlyLinkedList.updateNode(new PersonNode(1,"罗翔",55));
System.out.println("-----------------------------------------------");
System.out.println("修改后的结果");
singlyLinkedList.list();
System.out.println("-----------------------------------------------");
System.out.println("删除后的结果");
singlyLinkedList.delete(2);
singlyLinkedList.list();
}
}
class SinglyLinkedList {
// 创建一个头结点 不保存数据
PersonNode headNode = new PersonNode();
// 无序插入
public void add(PersonNode personNode) {
// 为了保证头节点不动 使用辅助变量
PersonNode temp = headNode;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
// 找到最后一个节点 将数据放入
temp.next = personNode;
}
// 有序插入
public void addByOrder(PersonNode personNode) {
// 单向链表只能找到下一个节点
PersonNode temp = headNode;
// 判断是否允许插入 默认编号不存在
boolean flag = false;
while (true) {
if (temp.next == null) {
// 说明找到了链表的最后
break;
}
if (temp.next.no > personNode.no) {
// 找到插入位置 在 temp 和 temp.next 中间
break;
} else if (temp.next.no == personNode.no) {
// 说明该编号的数据已经存在 不能插入
flag = true;
break;
}
// temp后移
temp = temp.next;
}
if (flag) {
System.out.printf("要插入的编号%d已经存在,不能插入\n", personNode.no);
return;
} else {
personNode.next = temp.next;
temp.next = personNode;
}
}
// 修改节点 根据编号修改
public void updateNode(PersonNode newPersonNode){
PersonNode temp=headNode.next;
// 是否能修改节点
boolean flag=false;
while (true){
if (temp == null) {
break;
}
// 找到要修改的节点
if (temp.no==newPersonNode.no){
flag=true;
break;
}
temp=temp.next;
}
if (flag) {
temp.age=newPersonNode.age;
temp.name= newPersonNode.name;
}else {
System.out.printf("要修改的节点%d不存在\n",newPersonNode.no);
}
}
// 删除节点
public void delete(int no){
PersonNode temp=headNode;
// 是否能删除 默认不能删除
boolean flag = false;
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;
}else {
System.out.printf("要删除的节点%d不存在\n",no);
}
}
// 遍历链表
public void list() {
// 判断链表是不是空
if (headNode.next == null) {
System.out.println("链表为空!");
return;
}
// 说明链表不为空 开始遍历数据
PersonNode temp = headNode.next;
while (true) {
// 不要判断下一位是否为空 自身也要输出
if (temp == null) {
break;
}
System.out.println(temp);
// temp后移
temp = temp.next;
}
}
}
// 节点对象
class PersonNode {
int no;
String name;
int age;
PersonNode next;
public PersonNode(int no, String name, int age) {
this.no = no;
this.name = name;
this.age = age;
}
public PersonNode() {
}
@Override
public String toString() {
return "PersonNode{" +
"no=" + no +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
Java 实现单链表 增删改
最新推荐文章于 2024-07-26 12:28:02 发布