教你实现链表判空与取值方法 | 带你学《Java面向对象编程》之九十二

上一篇:改数需备案-记录链表数据量 | 带你学《Java面向对象编程》之九十一
【本节目标】
通过阅读本节内容,你将学会实现isEmpty()和toArray()方法,为链表对象提供直接判断是否为空以及获取链表数据的方法,进一步完善链表类的相关功能。

空集合判断:public Boolean isEmpty()

链表里面可以保存有若干数据,如果说现在链表还没有保存数据,则就表示是一个空集合,则应该提供有一个空的判断。
1、在ILink接口里面追加有判断方法:

public boolean isEmpty() ;   //判断是否空集合

2、在LinkImpl子类里面覆写此方法。

public boolean isEmpty() {
    //return this.root == null ;
    return this.count == 0 ;
}

使用根节点或者长度判断其本质是一样的。

interface ILink<E> {         //设置泛型避免安全隐患
       public void add(E e) ;   //增加数据
       public int size() ;    //获取数据的个数
       public boolean isEmpty() ;   //判断是否空集合
}
class LinkImpl<E> implements ILink<E> {
      private class Node {         //保存节点的数据关系
              private E data ;      //保存数据
              private Node next ;       //保存下一个引用
              public Node(E data) {          //有数据的情况下才有意义
                     this.data = data ;
              }
                //第一次调用:this = LinkImpl.root ;
                //第二次调用:this = LinkImpl.root.next ;
                 //第三次调用:this = LinkImpl.root.next.next ;
              public void addNode(Node newNode){      //保存新的Node数据
                      if (this.next == null) {   //当前节点的下一个节点为null
                           this.next = newNode;      //保存当前节点
                      }else {
                           this.next.addNode(newNode);
                      }
               }
      }
      //------------以下为Link类中定义的成员-----------------
      private Node root ;       //保存根元素
      private int count ;     //保存数据的个数
      //------------以下为Link类中定义的方法-----------------
      public void add(E e){
         if(e == null){
             return ;
         }
        //数据本身是不具有关联特性的,只有Node类有,要想关联处理就必须将数据包装在Node类中
         Node newNode = new Node(e);    //创建一个新的节点
         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 ;
             return this.count == 0 ;
      }
}
public class LinkDemo{
       public static void main(String args[])  {
              ILink<String> all = new LinkImpl<String>() ;
              System.out.println("【增加之前】数据个数:" + all.size() + "、是否为空集合:" + all.isEmpty()) ;
              all.add("Hello") ;
              all.add("World") ;  
              all.add("MLDN") ;   
              System.out.println("【增加之后】数据个数:" + all.size() + "、是否为空集合:" + all.isEmpty()) ;
       }
}

教你实现链表判空与取值方法 | 带你学《Java面向对象编程》之九十二
图一 执行结果图

返回集合数据:public Object[] toArray()

链表本身就属于一个动态对象数组,那么既然是一个对象数组,就应该可以把所有的数据以数组的形式返回来,那么这个时候就可以定义一个toArray()方法,但是这个时候的方法只能够返回Object型的数组。

教你实现链表判空与取值方法 | 带你学《Java面向对象编程》之九十二
图二 数据返回

1、在ILink接口里面追加新的处理方法:

public Object[] toArray() ;     //将集合元素以数组的形式返回

2、在LinkImpl子类里面追加有两个属性:

private int foot ;     //描述的是操作数组的脚标
private Object [] returnData ;   //返回的数据保存

3、在Node类中根据递归获取数据

//第一次调用:this = LinkImpl.root
//第二次调用:this = LinkImpl.root.next
//第三次调用:this = LinkImpl.root.next.next
public void toArrayNode() {
    LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data ;
    if (this.next != null) {     //还有下一个数据
        this.next.toArrayNode() ;
    }
}

4、在进行数据返回的时候一定要首先判断数据返回是否为空

public Object[] toArray() {
    if (this.isEmpty()) {           //空集合
       return null ;      //现在没有数据
    }
    this.foot = 0 ;  //脚标清零
    this.returnData = new Object[this.count] ;   //根据已有的长度开辟数组
    this.root.toArrayNode() ; //利用Node类进行递归数据获取
    return this.returnData ;
}

教你实现链表判空与取值方法 | 带你学《Java面向对象编程》之九十二
图三 执行结果图

集合的数据一般如果要返回肯定要以对象数组的形式返回。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:速度了解神奇的索引操作 | 带你学《Java面向对象编程》之九十三
更多Java面向对象编程文章查看此处

上一篇:链表实战之宠物商店 | 带你学《Java面向对象编程》之九十五


下一篇:链表实战之超市购物车 | 带你学《Java面向对象编程》之九十六