java单链表
基本定义
链表的每一个数据像是一个节点,每个节点除了自己的信息之外,还有下一个节点的信息。
就像做任务一样,当前1任务完成,npc会告诉你下一个任务在哪里。
节点类定义
链表的每一个数据像是一个节点,每个节点除了自己的信息之外,还有下一个节点的信息。
//每一个heronode都是一个节点
class HeroNode{
public int no;
public String name;
public String nickName;
public HeroNode next;//指向下一个节点
public HeroNode(int no, String name, String nickName) {
super();
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
}
}
- 其中no,name,nickname为节点本身属性信息,next为此节点指向的下一个节点的信息。
定义单链表类
- 在单链表中起到开头作用的为起始节点。
- 下列代码块中,给出了单链表中常规的增删改查的基本操作。
class SingleLinkedL{
//1县初始化头节点
private HeroNode head = new HeroNode(0, "", "");
public HeroNode getHead() {
return head;
}
//2添加新节点
//原理:不考虑顺序时,先找到最后一个节点,根据next指向下一个node
public void addNode(HeroNode heroNode) {
//由于head节点不易变动,所以设计一个历史变量temp
HeroNode temp = head;
//遍历链表,找到最后
while(true) {
//找到链表的最后
if(temp.next == null){
break;
}
//未找到最后
temp = temp.next;
}
//当退出while循环时,已经找到链表的在最后,用这个节点的next指向新的节点
temp.next = heroNode;
}
//插入英雄的方式,将节点插入指定位置
public void addByOrder(HeroNode heroNode){
//找出临时变量为插入位置的前一个节点
//1.首先定义一个临时变量
HeroNode temp = head;
boolean flag = false;//标志是否已经存在要添加的节点
//2.遍历
while(true) {
if(temp.next == null) {//找到了最后一个节点
break;
}
if(temp.next.no > heroNode.no) {//找到添加的位置
break;
}
else if(temp.next.no == heroNode.no) {
flag = true;
break;//节点已经存在
}
//上述条件都不满足,继续寻找遍历
temp = temp.next;
}
if(flag){//已经存在
System.out.printf("节点%d数据已经存在",heroNode.no);
}else {
//加入到链表中
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//3显示链表
public void list() {
//判断是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while(true) {
if(temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
//4根据编号修改信息
public void update(HeroNode heroNode) {
//
if(head.next==null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
boolean flag = false;
while(true) {
if(temp == null) {
break;
}
if (heroNode.no == temp.no) {
//找到旧节点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//找到节点
temp.name = heroNode.name;
temp.nickName = heroNode.nickName;
}
else {
//没有找到
System.out.printf("没有找到编号为%d的数据\n",heroNode.no);
}
}
//删除节点
public void delete( int no) {
HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.no == no) {
flag = true;
break;//找到删除节点的前一个节点
}
temp = temp.next;
}
if(flag == true) {
//找到了,前一个节点的next指向下一个节点
System.out.printf("删除的%d节点后的结果",no);
System.out.println();
temp.next = temp.next.next;
}else {
System.out.printf("要删除的%d节点不存在",no);
}
}
public void Query(int no) {
HeroNode temp = head;
boolean flag = false;
while(true) {
if(head.next == null) {
System.out.println("链表为空");
break;
}
if(temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag == true) {
//找到了
System.out.println("查询到的结果");
System.out.println(temp);
}else {
System.out.printf("要查找的%d节点不存在",no);
}
}
}