java实现单向链表

顺序单向链表

顺序单向链表是一种数据结构,由一个个节点构成,前一个节点指向后一个节点,没有节点指向头节点,即每个节点都有下个节点的内存地址。随机增删改效率高,查询效率低。

代码实现

public class LinkedListTest {
    /**
     * 顺序结构的单向链表 --> 节点是英雄Hero
     * 新的直接添加在链表的末尾
     * 思路:
     * 英雄节点
     *      属性:
     *          英雄编号:public int no;
     *          英雄名字:public String name;
     *          英雄昵称:public String nickname;
     *          指向后继英雄的指针:public Hero next;
     *      方法:
     *          public String toString
     *
     * 链表
     *      属性:
     *          头节点:Hero header = new Hero(0,"","");
     *      方法:
     *          添加英雄
     *          public void add();
     *          删除英雄
     *          public void delete();
     *          修改英雄属性
     *          public void update();
     *          查询英雄信息
     *          public void select();
     *          打印链表中的所有英雄
     *          public void outputs();
     * @param args
     */
    public static void main(String[] args) {
        SingleLinkedList sll = new SingleLinkedList();
        //往链表中添加英雄
        sll.add(new Hero(1,"亚索","疾风剑豪"));
        sll.add(new Hero(3,"李青","盲僧"));
        sll.add(new Hero(2,"艾克","时间刺客"));
        sll.outputs();
        //查询英雄信息
        sll.select(3);
        //修改英雄信息
        sll.update(3,new Hero(3,"盖伦","德玛西亚之力"));
        sll.outputs();
        //删除英雄
        sll.delete(2);
        sll.outputs();
        sll.add(new Hero(2,"卡莎","虚空之女"));
        sll.add(new Hero(4,"照信","德邦总管"));
        sll.outputs();


    }
}

class SingleLinkedList{
    //头节点
    private Hero header = new Hero(0,"","");

    //添加英雄的方法
    public void add(Hero hero){
        //当链表为空时,直接添加在头节点后面
        if (header.next == null) {
            header.next = hero;
            return;
        }
        //链表不为空,通过头节点遍历链表,找到尾节点后添加
        //创建一个临时节点来指向头节点header的后继节点,遍历链表
        Hero temp = header.next;
        while (true){
            //当temp的指针域为null时,说明此时的temp就是尾节点,然后进行添加节点
            if (temp.next == null) {
                temp.next = hero;
                break;
            }
            //temp的指针域不为null,接着寻找尾节点,temp后移
            temp = temp.next;
        }
    }

    //删除英雄的方法
    public void delete(int no){
        //链表为空时,无法删除链表
        if (header.next == null) {
            System.out.println("链表为空,无法删除节点!");
            return;
        }
        //链表不为空,遍历节点,找到节点的编号与传入的no相等的节点的前一个节点,然后进行删除节点操作
        //创建一个临时节点,来遍历链表
        Hero temp = header;
        while (true){
            //将传入的no 和temp.next.no 进行比对,找到要删除节点的前一个节点
            if (temp.next.no == no) {
                //删除节点操作
                System.out.println("成功删除英雄--->" + temp.next);
                temp.next = temp.next.next;
                break;
            }
            //如果遍历到尾节点仍然没有找到符合条件的英雄,则说明要删除的英雄不在链表中
            if (temp.next == null) {
                System.out.println("该链表不存在您要删除的英雄!");
            }
            //temp后移以遍历所有节点
            temp = temp.next;
        }
    }

    //修改英雄信息的方法
    public void update(int no,Hero hero){
        //链表为空时,无法修改英雄信息
        if (header.next == null) {
            System.out.println("链表为空,无法修改英雄信息");
            return;
        }
        //链表不为空,遍历英雄节点,找到英雄节点的编号与传入的no相等的英雄节点的前一个英雄节点,然后进行修改节点操作
        //创建一个临时英雄节点,来遍历链表
        Hero temp = header;
        while (true){
            //将传入的no 和temp.next.no 进行比对,找到要修改的英雄节点的下一个英雄节点
            if (temp.next.no == no) {
                //修改英雄节点操作
                System.out.println("当前英雄节点" + temp.next + "信息已经被修改");
                hero.next = temp.next.next;
                temp.next = hero;
                System.out.println("修改后的英雄信息为:" + temp.next);
                break;
            }
            //如果遍历到尾节点仍然没有找到符合条件的英雄,则说明要删除的英雄不在链表中
            if (temp.next == null) {
                System.out.println("该链表不存在您要修改的英雄!");
            }
            //temp后移以遍历所有节点
            temp = temp.next;
        }
    }

    //通过英雄的编号去查找英雄的信息
    public void select(int no){
        //链表为空时,没有英雄信息
        if (header.next == null) {
            System.out.println("链表为空,无法修改英雄信息");
            return;
        }
        //链表不为空,通过临时节点遍历链表,对比no查找英雄
        Hero temp = header.next;
        while (true){
            //对比编号查找英雄
            if (temp.no == no) {
                System.out.println("您要查找的英雄信息为:" + temp);
                break;
            }
            //当遍历到尾节点时,仍然没有查找到该英雄,则说明该英雄不在该链表中
            if (temp.next == null) {
                System.out.println("您要查找的英雄不在该链表中");
            }
            //temp后移以遍历所有节点
            temp = temp.next;
        }
    }

    //打印链表中所以英雄的信息
    public void outputs(){
        //链表为空时,没有英雄信息
        if (header.next == null) {
            System.out.println("链表为空,没有英雄信息");
            return;
        }
        //链表不为空,通过临时节点遍历链表
        Hero temp = header.next;
        while (true){
            if (temp.next == null) {
                System.out.println(temp);
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }


}
class Hero{
    //英雄编号:
    public int no;
    //英雄名字:
    public String name;
    //英雄昵称:
    public String nickname;
    //指向后继英雄的指针:
    public Hero next;

    public Hero(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值