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

简介: 有了增加方法和计数方法,那么如何直观地判断链表内有没有数据呢,本节将带读者实现isEmpty()方法进行判空操作、实现toArray()方法获取链表内所有数据。

上一篇:改数需备案-记录链表数据量 | 带你学《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()) ;
       }
}

image.png
图一 执行结果图

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

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

image.png
图二 数据返回

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 ;
}

image.png
图三 执行结果图

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

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

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

相关文章
|
10天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
46 3
|
1天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
1天前
|
Java API
【亮剑】Java的List,如何删除重复的元素,教你三个方法搞定!
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
2天前
|
IDE Java 开发工具
基于Java程序设计的实验教学方法优化与实践
基于Java程序设计的实验教学方法优化与实践
9 1
|
4天前
|
存储 Java 索引
【JAVA】HashMap的put()方法执行流程
【JAVA】HashMap的put()方法执行流程
|
4天前
|
存储 算法 Java
【JAVA】Java 中 Set集合常用方法
【JAVA】Java 中 Set集合常用方法
|
7天前
|
Java
Java 与垃圾回收有关的方法
Java 与垃圾回收有关的方法
|
7天前
|
Java
Java基础&方法
Java基础&方法
|
7天前
|
Java 编译器
Java 方法
4月更文挑战第19天
|
7天前
|
存储 Java 测试技术
一文搞清楚Java中的方法、常量、变量、参数
在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:**常量与变量**,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。
15 0