zoukankan      html  css  js  c++  java
  • 链表09-开发可用链表(将链表变为对象数组)

    将链表变为对象数组:public 数据类型 [] toArray()

      将链表以对象数组的形式返回

      任何情况下,不管是什么样的类,都不可能在类中使用输出语句,只要是想输出数据一定要将数据返回到调用处进行输出,而由于链表属于动态对象数组,最好的做法是将链表以对象数组的形式返回

       通过以上分析发现,最终Link类的toArray()方法一定要返回一个对象数组,并且这个对象数组也一定要被Node类操作,那么这个对象数组最好定义在Link类的属性里面

       修改Link类的定义

        增加一个返回的数组属性内容,之所以定义为属性,是因为内部类和外部类都可以访问

    private String [] retArray; // 返回的数组

        增加toArray()方法

        public String [] toArray(){
            if (this.root == null){
                return null;
            }   
            this.foot = 0; // 需要脚标控制
            this.retArray = new String()[this.count]; //根据保存内容开辟数组
            this.root.toArrayNode(); //交给Node类处理
            return this.retArray;
        }

         在Node类里面处理数组数据的保存

            // 第一次调用:(Link) this = Link.root
            // 第二次调用:(Node) this = Link.root.next
            public void toArrayNode(){
                Link.this.retArray[Link.this.foot ++] = this.data;
                if (this.next != null){ // 有后续元素
                    this.next.toArrayNode();
                }
            }

        实现的前提:内部类与外部类之间可以直接进行私有属性的访问

    class Link{ // 链表类,外部只能看这一个类
        // 定义在内部,主要为Link类服务    
        private class Node{ // 定义的节点类
            private String data; // 保存数据
            private Node next; // 引用关系
            public Node(String data){
                this.data = data;
            }
            public void AddNode(Node newNode){
                if(this.next == null){ // 当前的下一个节点为空
                    this.next = newNode;
                }else{     // 向后继续保存
                    this.next.AddNode(newNode);
                }
            }
    
            public void printNode(){ // 打印Node信息
                System.out.println(this.data);
                if( this.next != null){
                    this.next.printNode();
                }
            }
    
            // 第一次调用(Link): this = Link.root
            // 第二次调用 (Node) : this = Link.root.next
            public boolean containsNode(String data){
                if (data.equals(this.data)){ // 当前节点数据为要查询数据
                    return true; //后面不再查询了
                }else{ //当前节点数据不满足查询要求
                    if (this.next != null){ // 有后续节点
                        return this.next.containsNode(data); 
                    }else{ // 没有后续节点了
                        return false; // 没得查了
                    }
                }
            }
            public String getNode(int index){
                // 使用当前的foot内容与要查询的索引进行比较
                // 随后将foot的内容自增,目的是为了下次查询方便
                if (Link.this.foot++ == index){ // 如果等于,为查询的索引
                    return this.data; // 返回当前节点数据
                }else{ // 现在应该继续向后查询
                    return this.next.getNode(index);
                }
            }
            public void setNode(int index,String data){
                // 使用当前的foot内容与要修改的索引进行比较
                // 随后将foot的内容自增,目的是为了下次修改方便
                if(Link.this.foot++ == index){ // 如果等于,为要修改的索引
                    this.data = data; // 重新赋值
                }else{ //继续向后查找要修改的索引
                    this.next.setNode(index,data);
                }
            }
            // 第一次调用:(Link) pervious = Link.root、this=Link.root.next
            // 第二次调用:(Node) pervious = this.root.next this=this.root.next.next
            // 要传递上一个节点以及要删除的数据
            public void removeNode(Node previous,String data){
                if (data.equals(this.data)){ // 当前节点为要删除节点
                    previous.next = this.next; // 空出当前节点
                }else{ //应该向后继续查询
                    this.next.removeNode(this,data);
                }
            }
            // 第一次调用:(Link) this = Link.root
            // 第二次调用:(Node) this = Link.root.next
            public void toArrayNode(){
                Link.this.retArray[Link.this.foot ++] = this.data;
                if (this.next != null){ // 有后续元素
                     this.next.toArrayNode();
                }
            }
    
            // ===================以上为内部类============================
        }
        private Node root; // 根结点
        private int count = 0; // 保存元素的个数
        private int foot = 0; 
        private String [] retArray; // 返回的数组
        public String get (int index){
            if (index > this.count){ // 超过了查询的范围
                return null;
            }
            this.foot = 0; // 表示从前向后查询
            return this.root.getNode(index); // 查询过程交给Node类处理
        }
        public void add(String data){  // 假设不允许有null
            if (data == null){
                return ;
            }
            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;
        }
    
        public boolean contains(String data){
            // 现在没有要查询的数据,要节点也不保存数据
            if ( data == null || this.root == null ) {
                    return false; //没有查询结果
            }
            return this.root.containsNode(data);
        }
        public void set(int index,String data){
            if(index > this.count){
                return ; //结束方法调用
            }
            this.foot = 0; // 重新设置foot属性的内容
            this.root.setNode(index,data); //交给Node类设置数据内容
        }
        public void remove(String data){
            if(this.contains(data)){ // 一定要保证数据存在
                // 要删除数据是否是根节点数据
                // root是内部类的对象,此处直接访问了内部类的私有操作
                if (data.equals(this.root.data)){ // 为要删除节点
                    this.root = this.root.next; // 突出当前根节点
                }else{ // 不是根元素
                    // 此时根元素已经判断过了,从第二个元素开始判断
                    this.root.next.removeNode(this.root,data);
                }
                this.count --;
            }
        }
        public String [] toArray(){
            if (this.root == null){
                return null;
            }
            this.foot = 0; // 需要脚标控制
            this.retArray = new String[this.count]; //根据保存内容开辟数组
            this.root.toArrayNode(); //交给Node类处理
            return this.retArray;
        }
    
    
        public void print(){ // 打印所有Node信息
            this.root.printNode();
        }
    
    
    }
    
    public class LinkDemo{
        public static void main(String args[]){
            Link all = new Link();
            all.add("Hello");
              all.add("World");
              all.add("World");
              all.add("World");
            all.set(1,"饿了吗?");
            String [] data = all.toArray();
            for (int i = 0; i<data.length; i++){
                System.out.println(data[i]);
            }
        }
    }

      链表数据变为对象数组取出是最为重要的功能

      这里并没有提到性能优化如,如对于大链表转换为数组的优化,这里只是基本的数据结构,为以后方便了解其它数据结构,打下基础。

      如果想要提高,可以在代码的细节中再做优化

  • 相关阅读:
    leetcode教程系列——Binary Tree
    《Ranked List Loss for Deep Metric Learning》CVPR 2019
    《Domain Agnostic Learning with Disentangled Representations》ICML 2019
    Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
    Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制
    Pytorch从0开始实现YOLO V3指南 part3——实现网络前向传播
    Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层
    Pytorch从0开始实现YOLO V3指南 part1——理解YOLO的工作
    让我佩服的人生 文章
    win8.1配置cordova+ionic等一系列东西
  • 原文地址:https://www.cnblogs.com/anyux/p/11878617.html
Copyright © 2011-2022 走看看