此单链表的说明:
该单链表实现了对元素的增、删、改、查。
该链表没有实现各元素的编号,显示的是各个元素的节点信息
该链表不允许存在两个信息完全相同的节点(当然如果你添加了相同信息的元素,会有提示反馈)
各种方法的细节可看代码注释
package CSDN;
import java.util.Scanner;
/**
* 单链表的实现
* 包含链表的 增、删、改、查
* @author Babulakaka
* @create 2021-06-11 9:30
*/
public class SingleListDemo {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
boolean loop=true;
while(loop){
Scanner scanner = new Scanner(System.in);
System.out.println("a:添加链表元素");
System.out.println("d:删除链表元素");
System.out.println("s:显示当前队列");
System.out.println("m:修改元素的信息");
System.out.println("f:查找指定用户信息");
System.out.println("e:退出");
char c = scanner.next().charAt(0);
switch(c){
case 'a':
System.out.print("请输入要添加元素的姓名:");
String nameA = scanner.next();
System.out.print("请输入要添加元素的年龄:");
int ageA = scanner.nextInt();
singleLinkedList.addNode(nameA,ageA);
break;
case 'd':
System.out.print("请输入要删除元素的姓名:");
String nameD = scanner.next();
System.out.print("请输入要删除元素的年龄:");
int ageD = scanner.nextInt();
singleLinkedList.deleteNode(nameD,ageD);
break;
case 'm':
System.out.print("请输入要修改元素的姓名:");
String nameM = scanner.next();
System.out.print("请输入要修改元素的年龄:");
int ageM = scanner.nextInt();
singleLinkedList.modifyNode(nameM,ageM);
break;
case 's':
singleLinkedList.show();
break;
case 'f':
System.out.println("请输入要查到的用户姓名:");
String nameF = scanner.next();
singleLinkedList.findNode(nameF);
break;
case 'e':
loop=false;
break;
}
}
}
}
class Node{
public String name;//节点属性
public int age;//节点属性
public Node next;//指向下一个节点
//构造器
public Node(){
}
public Node(String name){
this.name=name;
}
public Node(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "姓名:" + name+ " " + "年龄:"+ age;
}
}
class SingleLinkedList{
Node head = new Node();//头结点
public static int COUNTER;//记录节点的编号
//节点的添加
public void addNode(String name,int age){
Node node = new Node(name,age);//给新节点赋初始属性
Node temp = head;//头结点的dog,方便遍历,查询等操作
//首先查看该节点是否存在于该链表中
while (true){
if(temp.name==node.name&&temp.age==node.age){
System.out.println("当前输入的节点已经存在与该链表中");
return;
}
if(temp.next==null){//此时退出循环的temp就是当前链表的最后一个节点
break;
}
temp=temp.next;
}
//遍历链表找到位于链表的最后的节点
while (true){
if(temp.next==null){//此时退出循环的temp就是当前链表的最后一个节点
break;
}
temp=temp.next;
}
temp.next=node;//新节点加入当前链表
System.out.println("加入成功");
}
//节点的删除,根据节点的属性删除节点;前提是该节点不允许出现相同属性的节点。
public void deleteNode(String name,int age){
Node temp = head;//头结点的dog,方便遍历,查询等操作
Node node = new Node(name,age);
//判断链表中个是否有节点
if(head.next==null){
System.out.println("当前链表没有节点,无法删除");
return;
}
while (true){
if(temp.next==null){//此时退出循环的temp就是当前链表的最后一个节点
break;
}
//寻找要删除的元素,并且将其删除
if(temp.next.name.equals(node.name)&&temp.next.age==node.age){
temp.next = node.next;
System.out.println("删除成功节点:"+node.name);
return;
}
temp=temp.next;
}
System.out.println("没有找到要删除的元素");
}
//显示当前链表
public void show(){
Node temp = head;//头结点的dog,方便遍历,查询等操作
if(temp.next==null){
System.out.println("当前链表没有元素");
return;
}
while (true){
temp=temp.next;
System.out.println(temp.toString());
if(temp.next==null){
break;
}
}
}
//修改链表中的属性
public void modifyNode(String name,int age){
Node temp = head;//头结点的dog,方便遍历,查询等操作
Node node = new Node(name,age);
if(temp.next==null){
System.out.println("当前链表没有元素");
return;
}
while (true){
if(temp.next==null){//此时退出循环的temp就是当前链表的最后一个节点
break;
}
temp=temp.next;
//寻找要修改的元素,并且将其修改
if(temp.name.equals(node.name)&&temp.age==node.age){
System.out.println("请输入修改后的姓名:");
Scanner scanner = new Scanner(System.in);
String nameM = scanner.next();
System.out.println("请输入修改后的年龄: ");
int ageM = scanner.nextInt();
temp.name=nameM;
temp.age=ageM;
System.out.println("修改成功~~");
return;
}else {
System.out.println("没有找到所要修改的元素");
}
}
}
//查找链表元素的信息,可根据姓名查找对应的用户信息
public void findNode(String name){
Node temp=head;
Node node = new Node(name);
if(head.next==null){
System.out.println("链表为空,没有元素");
return;
}
while (true){
temp=temp.next;
if(temp.name.equals(node.name)){
System.out.println("查到指定用户:用户姓名为:"+temp.name+" 年龄为"+temp.age);
return;
}
if(temp.next==null){
System.out.println("没有找到指定的客户");
break;
}
}
}
}