单链表(2)

44 阅读3分钟

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

单链表实例:

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

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

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

1)单链表添加

第一种方法:在添加人物时,直接加到链表的尾部

思路分析:

1.找到这个链表的最后节点

2.将这个节点的  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.add(hero1);

singleLinkedList.add(hero2);

singleLinkedList.add(hero3);

singleLinkedList.add(hero4);

singleLinkedList.add(hero5);

singleLinkedList.add(hero6);

singleLinkedList.add(hero7);

singleLinkedList.add(hero8);

singleLinkedList.add(hero9);

singleLinkedList.add(hero10);

singleLinkedList.add(hero11);

singleLinkedList.list();

}

}

 

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

class SingleLinkedList{

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

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


    public void add(HeroNode heroNode) {

    //由于head的值不能改变,需要一个变量来辅助进行遍历

    HeroNode temp=head;

    //找到最后一位的链表节点

    while(true) {

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

    if(temp.next==null) {

        break;

    }

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

    temp=temp.next;

}

    //此时退出循环后为最后一个节点,然后我们就可以将这个元素添加到最后一个节点的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>在toString()改写时不应该放next域,因为next域会一直输出下一个节点,而下个节点也有next域,会将所有节点输出在一行上,所以要将next域去掉

eg:HeroNode [no=1, name=皮耶罗, nickname=丑角, next=HeroNode [no=2, name=多托雷, nickname=博士, next=HeroNode [no=3, name=哥伦比娅, nickname=少女, next=HeroNode [no=4, name=阿蕾奇诺, nickname=仆人, next=HeroNode [no=5, name=普契涅拉, nickname=公鸡, next=HeroNode [no=6, name=国崩, nickname=散兵, next=HeroNode [no=7, name=桑多涅, nickname=木偶, next=HeroNode [no=8, name=罗莎琳, nickname=女士, next=HeroNode [no=9, name=潘塔罗涅, nickname=富人, next=HeroNode [no=10, name=卡皮塔诺, nickname=队长, next=HeroNode [no=11, name=达达利亚, nickname=公子, next=null]]]]]]]]]]]

2>为什么要找的是最后节点呢?因为在构造器中已经对添加的值进行了初始化赋值,所以我们需要做的就是对next域进行更新,这样当我们更新完next域后就将两个链表进行链接起来