算法与数据结构(二) - 线性结构之单链表

单链表

在这里插入图片描述
上面的数组/栈/队列都是顺序存储,链表/循环链表/双链表都是链式存储。
单链表在存储本身数据的同时也要存储它的下一个数据的地址,就比如说火车的一节一节车厢,车厢本身既要承载乘客也要连接下一节车厢,直到最后车厢

单链表的增删改查实现:

package com.company;

/**
 * @author Shuoshi.Yan
 * @package:com.company
 * @className:
 * @description:
 * @data 2019-11-08 09:28
 * @version:V1.0
 * @NOTICE:本内容仅限于xxx有限公司内部传阅,禁止外泄以及用于其他的商业项目
 * @ Copyright  xxx. All rights reserved.
 **/

public class MyNode {
    int data;
    MyNode nextNode;

    public MyNode(int data) {
        this.data = data;
    }
    //添加节点,在当前节点的最后的子节点添加
    public MyNode append(MyNode myNode){
        //获取当前节点
        MyNode myNode1 = this;
        //循环获取当前节点下的子节点
        while(true){
            MyNode myNode2 = myNode1.nextNode;
            //若没有下个子节点
            if(myNode2 == null){
                break;
            }
            //此节点不是最后的节点
            myNode1 = myNode2;
        }
        //把要追加的节点追加到找到的最后一个节点的下一个节点
        myNode1.nextNode = myNode;
        return this;
    }
    //获取下一个节点
    public MyNode getNext(){
        //容错
        if(this.nextNode == null){
            return new MyNode(999);
        }
        return this.nextNode;
    }
    //删除节点,将删除的节点的子节点替换到删除的节点的位置
    public void remove(){
        this.nextNode = this.getNext().nextNode;
    }
    //判断最后一个节点是否是最后一个子节点
    public boolean isLast(){
        return nextNode == null;
    }
    //获取所有节点的data
    public void getAllNodedata(){
        MyNode myNode = this;
        while(myNode.data != 999){
            System.out.print(myNode.data + " ");
            myNode = myNode.getNext();
        }
    }
    //插入节点,将下一个节点作为下下个节点,将插入的节点作为下个节点
    public void insert(MyNode myNode){
        //取出当前节点的下一个节点,作为下下个节点
        MyNode treeNode = this.nextNode;
        //把新节点作为当前节点的子节点
        this.nextNode = myNode;
        //将原当前节点的子节点作为下下个节点
        myNode.nextNode = treeNode;
    }


    public static void main(String[] args) {
        //头,根节点
        MyNode myNode = new MyNode(1);
        //追加三个子节点
        myNode.append(new MyNode(2)).append(new MyNode(3)).append(new MyNode(4));
        //获取第二个子节点,也就是第三层节点
        System.out.println("获取第二个子节点,也就是第三层节点:" + myNode.getNext().getNext().data);
        //判断第二个子节点是不是最后一个子节点
        System.out.println("判断第二个子节点是不是最后一个子节点:" + myNode.getNext().getNext().isLast());
        System.out.print("展示所有节点:");
        myNode.getAllNodedata();
        System.out.println();
        System.out.print("删除第二个节点后:");
        myNode.remove();
        myNode.getAllNodedata();
        System.out.println();
        System.out.print("插入第三层节点:");
        myNode.nextNode.insert(new MyNode(10));
        myNode.getAllNodedata();
    }
}

输出:
在这里插入图片描述
添加节点,在当前节点的最后的子节点添加
删除节点,将删除的节点的子节点替换到删除的节点的位置
插入节点,将下一个节点作为下下个节点,将插入的节点作为下个节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值