1.创建单链表
演示案例背景:将学生信息插入单链表,学生信息包括年级排名和姓名。
//点赞加关注,一起学习一起进步
1.创建节点
package linkedList;
/**
* @author li
* 学生实体类,根据这个类创建的每一个对象都是单链表的一个节点
*
*/
public class StudentNode {
public int ranking;//成绩排名
public String name;//学生姓名
public StudentNode next;//指向下一个节点
/*构造器
*
*/
public StudentNode(int ranking,String name) {
this.name=name;
this.ranking=ranking;
}
}
2.创建空的单链表
class singleLinkedList{
// 初始化头节点,头节点固定不能更改头节点不存放具体数据
private StudentNode head =new StudentNode(0,"");
}
2.对单链表进行增删改查操作
以下各个方法操作均放在1.2的单链表类中
1.尾插法增加节点
头插法与尾插法类似,不再举例
/*
* 尾插法,逐个从尾部插入,操作简单,头插法同理
* 添加节点到单向链表的最后
* 首先需要找到当前链表的最后一个节点
* 让最后节点的next域指向新节点
* 新节点即为studentNode
*/
public void add(StudentNode studentNode) {
//head头节点不能移动,定义辅助变量(指针)指向head,temp可以移动
StudentNode temp=head;
//遍历寻找表尾
while(true) {
if(temp.next==null) {
break;
}
temp=temp.next;
}
//当循环退出,temp指向原链表的表尾节点
//完成新节点的添加
temp.next=studentNode;
}
2.遍历显示单链表
/*
* 遍历显示单链表
*/
public void list() {
if(head.next==null) {
System.out.println("该链表为空");
return;
}
//再次使用辅助变量(指针)temp,指向第一个数据节点
StudentNode temp=head.next;
while(true) {
//尾节点的下一个next为空,即循环遍历结束
if(temp==null) {
break;
}
//输出节点信息
System.out.println(temp.name+"\t"+temp.ranking);
//辅助变量(指针)后移
temp=temp.next;
}
}
3.中间任意插入法增加节点
/*
* 中间任意插入法,操作灵活
* 例如,根据学生成绩排序,随意输入学生信息,自动在链表中更具排名先后存储
* 首先找到待插入节点的前一个节点temp
* 新节点.next=temp.next
* temp.next=新节点
*/
public void add1(StudentNode newNode) {
StudentNode temp=head;//辅助指针
boolean flag=false;//用于判断待添加节点在链表中是否已经催在,默认不存在
while(true) {
if(temp.next==null) {
break;
//temp所指向的节点在表尾,可以插入
}
if(temp.next.ranking>newNode.ranking) {
break;
//newNode正是要插入temp后面
}
if(temp.next.ranking==newNode.ranking) {
flag=true;
break;
//该节点链表中已经存在,无法再次添加
}
temp=temp.next;
}
if(flag) {
System.out.println("该排名编号已存在,无法添加");
}
else {
//执行新节点插入
newNode.next=temp.next;
temp.next=newNode;
}
}
4.修改节点信息
/*
* 修改节点信息
*
*/
public void update(StudentNode newStudentNode) {
//先判断链表是否为空
if(head.next==null) {
System.out.println("单链表为空,修改失败");
return;
}
StudentNode temp=head.next;
boolean flog=false;//标记是否找到待修改节点
while(true) {
if(temp.next==null) {
break;
//链表遍历完毕
}
if(temp.ranking==newStudentNode.ranking) {
flog=true;
break;
//找到目标
}
temp=temp.next;
}
if(flog) {
temp.name=newStudentNode.name;
//修改完毕
}else {
System.out.println("没有找到目标节点,修改失败");
}}
5.删除节点
/*
* 删除节点
* 删除方法:temp=temp.next.next
*/
public void dle(int r) {
//先判断链表是否为空
if(head.next==null) {
System.out.println("单链表为空,删除失败");
return;
}
StudentNode temp=head;
boolean flag=false;//标记是否找到待删除节点
while(true) {
if(temp.next==null) {
break;
//链表遍历完毕
}
if(r==temp.next.ranking) {
//找到了待删除节点的前一个节点temp
flag=true;
break;
//找到目标
}
temp=temp.next;
}
if(flag==true) {
temp.next=temp.next.next;
//修改完毕
}
else {
System.out.println("没有找到目标节点,删除失败");
}
}
3.测试类
/**
* @author li
*测试类,对单链表功能进行测试
*先创建部分节点,再创建链表,手动把节点加入链表
*/
public class text {
public static void main(String[] args) {
//创建节点
StudentNode s1=new StudentNode(1,"张三");
StudentNode s2=new StudentNode(3,"李四");
StudentNode s3=new StudentNode(2,"王五");
//创建单链表
singleLinkedList singleLinkedList1=new singleLinkedList();
//测试尾插法
// singleLinkedList1.add(s3);
// singleLinkedList1.add(s2);
// singleLinkedList1.add(s1);
//测试中间任意插入法
singleLinkedList1.add1(s3);
singleLinkedList1.add1(s2);
singleLinkedList1.add1(s1);
//显示列表
singleLinkedList1.list();
//测试修改列表
StudentNode s4=new StudentNode(2,"赵六");
singleLinkedList1.update(s4);
//显示列表
System.out.println("修改之后:");
singleLinkedList1.list();
//测试删除节点
singleLinkedList1.dle(1);
//显示列表
System.out.println("删除节点之后:");
singleLinkedList1.list();
}
}
部分测试结果