单链表的增删改查

181 阅读4分钟

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

方法重写

在学习之前先要了解什么是方法重写,简单来说,方法重写就是子类可继承父类中的方法,而不需要重新编写相同的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

重写条件

(1)必须是继承关系

(2)子类中的方法要和父类一样

(3)重写是发生在两个类中

重写好处

子类扩展了父类中的方法,让父类中的功能变得更加强大。

注意:如果子类想调用父类方法,直接在重写方法中使用 super 关键字重写父类中的方法,且方法的修饰符必须是公共的,私有方法不可以重写。

重写演示

编写一个父类Animal

    public String name;//属性
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    public void eat() {
        System.out.println("喜欢……");
    }
}

再编写一个子类Dog,并继承父类

 
    @Override //方法重写的标记,看到此标记就代表方法重写现象
    public void eat() {
        //方法重写现象,在该类中eat方法和父类Animal中的eat方法的名称一样
        super.eat();//调用父类的 eat 方法
        System.out.println("吃骨头……");
    }
}

编写Demo类进行演示

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("哈士奇……");
        System.out.println(dog.getName());
        dog.eat();
    }
}

查看输出结果:

QQ图片20221121080925.png

单链表

介绍

(1)链表是以节点额方式来存储,是链式存储 (2)每个节点包含data域,next域:指向下一个节点 (3)链表的每个节点不一定是连续存储的 (4)链表分带头节点的链表和没有头节点的链表,根据实际需求来确定单链表(带头节点)

单链表的增删改查

创建HeroNode类,用来存放信息

class HeroNode {
    public int no;
    public String name;
    public String nickname;//昵称
    public HeroNode next;//指向下一个节点
 
    //构造器
    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }
 
    //为了显示方法,这里重写 toString() 方法
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' + "}";
    }
}

创建SingleLinkedList类,用来存放方法

按顺序插入到链表最后

(1)先创建一个 head头节点,作用就是表示单链表的头

(2)后面每添加一个节点,就直接加入到链表最后,也可以理解为每有一个新节点,我们就把最后一个节点的 next域 指向新节点

链表为空的条件:head.next == null(表示头节点的下一位为空)

链表最后的条件:temp.next == null (temp为辅助变量)

    private HeroNode head = new HeroNode(0 , "" , "");
    //头节点不存放具体的数据
 
    public HeroNode getHead() {//返回头节点
        return head;
    }
 
    //思路:
    //1.找到当前链表的最后一个节点
    //2.将最后这个节点的next域指向新的节点
    public void add(HeroNode heroNode) {
        //因为head头节点不能动,所以需要一个辅助变量temp
        HeroNode temp = head;//将temp指向head
        //遍历链表,找到链表最后
        while(true) {
            //当temp的域等于空时,说明temp找到了链表最后了
            if(temp.next == null) {//找到最后了,结束程序
                break;
            }
            //如果没有找到最后,就将temp 后移指向下一个数据
            temp = temp.next;
        }
        //当退出了 while 循环时,那么 temp 就指向了链表的最后
        temp.next = heroNode; //将最后这个节点的next域指向新的节点
    }

按照编号的顺序添加

(1)首先找到新添加节点的位置,是通过辅助变量找到的

(2)添加方法:

1)新的节点.next = temp.next

2)temp.next = 新的节点

删除节点

(1)先找到需要删除的这个节点的前一个节点 temp

(2)temp.next = temp.next.next

(3)被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收