单链表(3)

62 阅读4分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

单链表实例:

使用head头的单向链表实现—原神愚人众排行榜管理,来完成对人物的增删改查操作。

head头节点,不存放任何数据,就是代表一个单链表的标头

以判断链表是否为null来为链表结束的标志

单链表添加:

第二种方法:在添加人物时,根据排名将人物插入到指定的位置,若有排名,则会添加失败

思路分析:1.首先要找到按照序号排名的节点位置,还是通过辅助变量找,由遍历来实现

2.新的节点.next=temp.next,将新的节点与后一个节点相联系

3.temp.next=新的节点 ,将新的节点与前一个节点相联系

代码实现


 

public static void main(String[] args) {

//进行测试

//创建节点

HeroNode hero1 = new HeroNode(1, "皮耶罗","丑角" );

HeroNode hero2 = new HeroNode(2, "多托雷","博士" );

HeroNode hero3 = new HeroNode(3, "哥伦比娅","少女" );

HeroNode hero4 = new HeroNode(4, "阿蕾奇诺","仆人" );

HeroNode hero5 = new HeroNode(5, "普契涅拉","公鸡" );

HeroNode hero6 = new HeroNode(6, "国崩","散兵" );

HeroNode hero7= new HeroNode(7, "桑多涅","木偶" );

HeroNode hero8= new HeroNode(8, "罗莎琳","女士" );

HeroNode hero9 = new HeroNode(9, "潘塔罗涅","富人" );

HeroNode hero10 = new HeroNode(10, "卡皮塔诺","队长" );

HeroNode hero11 = new HeroNode(11, "达达利亚","公子" );

//创建单链表

SingleLinkedList singleLinkedList = **new** SingleLinkedList();

//将数据添加进单链表中,这里是不按照顺序插入的

singleLinkedList.add1(hero2);

singleLinkedList.add1(hero1);

singleLinkedList.add1(hero4);

singleLinkedList.add1(hero3);

singleLinkedList.add1(hero5);

singleLinkedList.add1(hero6);

singleLinkedList.add1(hero8);

singleLinkedList.add1(hero9);

singleLinkedList.add1(hero7);

singleLinkedList.add1(hero11);

singleLinkedList.add1(hero10);

singleLinkedList.list();

}

}

 

//定义一个SingleLinkedList来管理节点

class SingleLinkedList{

//先新建一个头结点,不存放具体的数据

private HeroNode head=new HeroNode(0,"","");

//定义第二种添加链表的方式

public void add1(HeroNode heroNode) {

//首先呢还是需要一个变量来辅助进行遍历,如果没有这个变量辅助的话是无法找到位置的

//处于单链表当中,因此我们找到的temp是单链表的前一个节点中,否则是插入不了的

HeroNode temp=head;

//定义一个值,用来判断是否值已经存在,若相等就给出提示,默认为false

boolean flag=false;

//找到单链表的前一个节点

while(true) {

//只有最后一个节点才会为null,这个时候就可以退出了,这里单链表的前一个节点的位置就是最后一个节点的位置

if(temp.next==null) {

break;

}

//

if(temp.next.no>heroNode.no) {

//已经找到了位置,就在temp后插入即可

break;

}

else if(temp.next.no==heroNode.no){

//要添加的编号已经存在

flag=true;

}

//若没有找到最后一个节点,就将值进行后移,这样程序会不断的前进

temp=temp.next;

}

//先判断flag的值有没有不一样

if(flag) {

System.out.printf("该%d已经存在,无需添加\n",heroNode.no);

}

else {

//插入到链表中,temp的后面

heroNode.next=temp.next;

temp.next=heroNode;

}

}

//显示所有链表(遍历)

public void list() {

//首先应判断一下链表是否为空

if(head.next==**null**) {

System.out.println("链表的值为空,不能进行遍历");

return;

}

//跟add()同样的是,由于head的值不能改变,需要一个变量来辅助进行遍历

HeroNode temp=head.next;

while(true) {

//首先要有结束语句,否则程序会陷入死循环

//结束条件就是到最后一个节点

if(temp==null) {

break;

}

//若没有跳出程序,就会一直输出显示语句

System.out.println(temp);

//将值进行后移,这样程序会不断的前进

temp=temp.next;

}

}

}

 

//定义HeroNode,每个HeroNode对象就是一个节点

class HeroNode{

public int no;

public String name;

public String nickname;

public HeroNode next; //指向下一个节点,所以要定义一个HeroNode类型的

public HeroNode(**int** no, String name, String nickname) {

this.no = no;

this.name = name;

this.nickname = nickname;

}

@Override

public String toString() {

return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname  + "]";

}

}

代码要点:

1.只有最后一个节点才会为null,这个时候就可以退出了,这里单链表的前一个节点的位置就是最后一个节点的位置

if(temp.next==null) {

break;

}

2.若执行到最后一个,其实也是已经找到了位置,直接在temp后插入即可temp.next.no>heroNode.no

3.若两者相等说明要添加的编号已经存在

temp.next.no==heroNode.no

4.通过布尔值来判断类型