Java基础学习15

链表(单向链表的建立、删除、插入、打印)

1、链表一般分为:

单向链表

  双向链表

​ 环形链表

//链表
//数据结构核心组成:引用+递归
//数组是一个定长的线性结构
class Node{//只有node类才可以在保存数据的同时设置数据的先后关系
    private Object data ;//真正要保存的数据
    private Node next  ;//定义下一个节点
    //node类的核心作用在于保存数据和连接节点关系
    public Node(Object data){   //车厢里面一定要去保存有数据
        this.data = data;
    }
    public void setData(Object data){
        this.data = data;
    }
    public Object getData(){
        return this.data;
    }
    public void setNext(Node next){
        this.next = next;
    }
    public Node getNext(){
        return this.next;
    }
}
public class Day15 {
    public static void main(String[] args) throws Exception{
        //1、封装几个节点
        Node root = new Node("火车头");//现在假设存放的数据是string
        Node n1 = new Node("车厢A");
        Node n2 = new Node("车厢B");
        Node n3 = new Node("车厢C");
        //2、需要设置节点的关系
        root.setNext(n1);
        n1.setNext(n2);
        n2.setNext(n3);
        //3、输出节点
        print(root);
    }
    public static void print(Node node){
        if (node != null){//表示当前存在有节点
            System.out.println(node.getData());
            print(node.getNext());//继续向下取出
        }

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYaWQvGv-1633234349366)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210926195816584.png)]

数据的存储和返回

class Link{     //负责链表的操作
    //将Node定义为内部类,表示Node类只为Link类服务
    private class Node{     //负责数据与节点关系的匹配
        private Object data ;   //保存节点的数据
        private Node next ; //保存下一个节点
        public Node(Object data){
            this.data = data ;
        }
        //第一次调用:this = Link.root
        //第二次调用:this = Link.root.next
        //第三次调用:this = Link.root.next.next
        public void addNode(Node newNode){//处理节点关系
            if (this.next == null) {//当前节点下一个为空,表示可以保存
                this.next = newNode;
            }else {         //现在当前节点的下一个不为空
                this.next.addNode(newNode);
            }
        }
        //第一次调用:this = Link.root
        //第二次调用:this = Link.root.next
        public void toArrayNode(){
            Link.this.retData[Link.this.foot++] = this.data;
            if (this.next != null){     //现在还有下一个节点
                this.next.toArrayNode();
            }
        }
    }
    //--------------以下为Link类定义-------------------
    private Object[] retData;//返回类型
    private int foot = 0;//操作脚标
    private int count = 0;//当前的保存个数
    private Node root;//属于根节点,没根节点无法进行数据的保存,存第一个节点
    public void add(Object data){
        if (data == null){  //人为的追加了规定,不允许存放空值
            return;     //方法结束调用
        }
        //如果要进行数据的保存,那么必须将数据封装在Node节点
        //如果没有封装,则无法确认好节点的先后顺序
        Node newNode = new Node(data);
        if (this.root == null){     //当前并没有根节点
            this.root = newNode ;   //第一个节点设置为根节点
        }else {     //根节点已经存在了
            this.root.addNode(newNode);
        }
        this.count++;//数据累加处理
    }
    public int size(){      //取得元素个数
        return this.count ;
    }
    public boolean isEmpty(){//判断是否为空
        return this.root == null && this.count == 0 ;
    }
    public Object[] toArray(){
        if (this.count==0){
            return null ;
        }
        //现在链表中存在数据,则将开辟指定长度的数组
        //该数组一定要交给Node类进行处理。
        this.retData = new Object[this.count];
        this.foot = 0;//进行清零的处理,需要进行脚标的操作
        this.root.toArrayNode();//将数据的取出处理交给Node类完成
        return this.retData;
    }
}
public class Test24 {
    public static void main(String[] args) {
        Link all = new Link();
        System.out.println(all.size()+"="+all.isEmpty());
        all.add("hello");
        all.add("world");
        all.add("hehao");
        System.out.println(all.size()+"="+all.isEmpty());
        Object result [] = all.toArray();
        for (int x = 0;x< result.length;x++){
            System.out.println(result[x]);
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVQHKxsh-1633234349368)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210926195748128.png)]

x = 0;x< result.length;x++){
System.out.println(result[x]);
}
}
}


[外链图片转存中...(img-wVQHKxsh-1633234349368)]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值