目录
一、单链表(Linked List)应用实例二
- 一、单链表(Linked List)应用实例二
- 二、在链表的指定位置添加节点数据的思路分析示意图
- 三、删除链表节点数据的思路分析示意图
- 四、单链表(Linked List)应用实例二代码示例
- 单链表添加节点时,根据节点编号排名,将节点数据添加到指定位置
1、定义一个人员节点类,每一个PersonNode对象就是一个节点
package com.rf.springboot01.dataStructure.singleLinkedList;
/**
* @description: 定义一个人员节点类,每一个PersonNode对象就是一个节点
* @author: xiaozhi
* @create: 2020-07-15 16:44
*/
public class PersonNode {
public int num;//编号
public String name;//名称
public String aliasName;//别名
public PersonNode next;//指向下一个节点
//构造器
public PersonNode(int num, String name, String aliasName) {
this.num = num;
this.name = name;
this.aliasName = aliasName;
}
//重写toString方法
@Override
public String toString() {
return "PersonNode{" +
"num=" + num +
", name='" + name + '\'' +
", aliasName='" + aliasName + '\'' +
'}';
}
}
2、创建一个单链表管理人员节点
package com.rf.springboot01.dataStructure.singleLinkedList;
/**
* @description: 创建一个单链表管理人员节点,在链表的指定位置添加
* @author: xiaozhi
* @create: 2020-07-15 23:13
*/
public class SingleLinkedList2 {
/**
* @Description: 在链表的指定位置添加节点到单链表思路
* 1. 首先找到新添加的节点的位置, 是通过辅助变量(指针), 通过遍历来搞定
* 2. 新的节点.next = temp.next
* 3. 将temp.next = 新的节点
* @Param: [personNode]
* @Author: xz
* @return: void
* @Date: 2020/7/15 16:53
*/
//先初始化一个头结点,头节点位置固定,不存放任何数据,作用是表示链表的头节点
private PersonNode head=new PersonNode(0,"","");
//在链表的指定位置添加节点数据
public void addByNum(PersonNode personNode){
PersonNode temp=head;// //因为head节点不能动,因此我们需要一个临时变量temp
boolean flag=false;//插入的编号是否存在,默认不存在
while(true){
if(temp.next==null){//已经在链表的尾部
break;
}
if(temp.next.num >personNode.num){//找到位置,在temp后添加
break;
}
if(temp.next.num==personNode.num){//编号已经存在,不能添加
flag=true;
break;
}
temp=temp.next;//后移,遍历
}
if(flag){
System.out.printf("添加的人员编号%d已经存在,不能添加\n",personNode.num);
}else{
//添加数据到链表中,temp后的位置
personNode.next=temp.next;
temp.next=personNode;
}
}
//根据编号修改节点信息
public void updateByNum(PersonNode personNode){
if(head.next==null){
System.out.println("链表为空");
return;
}
//找到需要修改的节点,根据num修改
PersonNode temp=head.next;
boolean flag=false;//表示是否找到需要修改的节点编号,默认已找到
while(true){
if(temp==null){
break;//表示已遍历完链表
}
if(temp.num==personNode.num){//已找到需要修改的节点编号
flag=true;
break;
}
temp=temp.next;
}
if(flag){//已找到需要修改的节点编号
temp.name=personNode.name;
temp.aliasName=personNode.aliasName;
}else{
System.out.printf("没有找到 编号%d的节点,不能修改\n",personNode.num);
}
}
//删除链表节点
public void delete(int num){
PersonNode temp=head;
boolean flag=false;//标志是否找到待删除节点
while(true){
if (temp.next==null){//已找到链表最后
break;
}
if(temp.next.num==num){//已找到待删除的节点的前一个节点temp
flag=true;
break;
}
temp=temp.next;//临时变量后移
}
if(flag){//找到待删除的节点,可以删除
temp.next=temp.next.next;
}else{//没有找到待删除的节点
System.out.printf("要删除的 d% 节点不存在",num);
}
}
//显示链表(不包括头节点,因为头节点不存放任何数据)
public void show(){
//判断链表是否为空,用head.next判断是因为不包括头节点
if(head.next==null){
System.out.println("链表为空");
return;
}
//因为头节点不能动,通过临时变量代替
//不包括头节点,因为头节点不存放任何数据,所以head.next(头节点的下一个节点)赋值给临时变量temp
PersonNode temp=head.next;
while(true){
//判断是否到链表最后
if(temp == null){
break;
}
//输出节点信息
System.out.println(temp);
//将temp向后移动
temp = temp.next;
}
}
}
3)、定义单链表测试类
package com.rf.springboot01.dataStructure.singleLinkedList;
/**
* @description:
* @author: xiaozhi
* @create: 2020-07-16 09:39
*/
public class SingleLinkedList2Test {
public static void main(String[] args) {
//创建节点
PersonNode personNode1 = new PersonNode(1, "张三", "小张");
PersonNode personNode2 = new PersonNode(2, "李四", "小李");
PersonNode personNode3 = new PersonNode(3, "王五", "小王");
PersonNode personNode4 = new PersonNode(4, "赵二", "小赵");
System.out.println("添加链表节点数据============");
//添加链表节点数据
SingleLinkedList2 singleLinkedList2 = new SingleLinkedList2();
singleLinkedList2.addByNum(personNode1);
singleLinkedList2.addByNum(personNode4);
singleLinkedList2.addByNum(personNode2);
singleLinkedList2.addByNum(personNode3);
singleLinkedList2.addByNum(personNode3);
//显示链表数据
singleLinkedList2.show();
System.out.println("根据编号修改节点数据============");
//修改链表数据
PersonNode personNode5 = new PersonNode(1, "张三丰", "小张三");
singleLinkedList2.updateByNum(personNode5);
//修改之后在显示链表数据
singleLinkedList2.show();
System.out.println("根据编号删除节点数据后的数据展示============");
singleLinkedList2.delete(1);
singleLinkedList2.delete(4);
singleLinkedList2.delete(2);
//删除之后在显示链表数据
singleLinkedList2.show();
}
}
4、运行测试类,输出结果