为了账号安全,请及时绑定邮箱和手机立即绑定

Java中链表的最基本实现

标签:
Java
//可用链表,链表的基本实现
class 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);
          }
       }
       //第一次是由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;//没得查了直接返回false
             }
          }
       }
       public String getNode(int index){
          if(Link.this.foot++ == index){//找到要查找的索引时
             return this.data;//返回当前节点数据
          }else{//继续向后查询
             return this.next.getNode(index);
          }
       }
       public void setNode(int index,String data){
          if(Link.this.foot++ == index){
            this.data = data;
          }else{
            this.next.setNode(index,data);
          }
       }
       public void removeNode(Node previous,String data){
          if(data.equals(this.data)){ //当前节点为要删除的节点
              previous.next = this.next;
          }else{  //往后继续查询
              this.next.removeNode(this,data);
          }
       }
       public void toArrayNode(){
          //将数据逐个保存到数组toArray[]里面 
          Link.this.retArray[Link.this.foot++] = this.data; 
          if(this.next != null){ // 有后续节点
             this.next.toArrayNode(); //实现逐个保存
          }
       }
    }
    //============================以上为内部类==================
    private Node root;//需要根节点
    private int foot = 0;
    private int count = 0;
    private String[] retArray;
    public void add(String data){//1.增加数据
      if(data == null){
         return;  
      } 
      Node newNode = new Node(data);
      if(this.root == null){//
         this.root = newNode;
      }else{//存在根节点,那么其他节点交给Node类处理
         this.root.addNode(newNode);//
      }
      this.count++;//每次保存完成后数据加1
    }
    public int size(){//2.取得链表长度
       return this.count;//返回保存元素的个数
    }
    public boolean isEmpty(){//3.判断是否为空链表
       return this.count == 0;
    }
    public boolean contains(String data){//4.查询数据
        //要查的数据为空且根元素没有数据
       if(data == null ||this.root == null){
           return false; //没有查询结果
       }
       return this.root.containsNode(data);//交给Node类处理
    }
    public String get(int index){//5.根据索引取得数据
       if(index >= this.count){//超过搜索范围
          return null;
       }else{//在搜索范围内
          this.foot = 0;//初始化 方便再次查询
          return this.root.getNode(index);//交给Node类处理
       }
    }
    public void set(int index,String data){//6.修改指定索引的内容
       if(index > this.count){//超过索引范围
          return;//结束方法调用
       }
       this.foot = 0;//重新设置foot属性作为索引出现
       this.root.setNode(index,data);//交给Node类设置数据
    }
    public void remove(String data){//7.删除指定内容/数据
       if(this.contains(data)){
           if(data.equals(this.root.data)){//要删除的是根节点
               this.root = this.root.next;
           }else{ //不是根节点
               this.root.next.removeNode(this.root,data);
           }
           this.count--;//每删除一次,长度减1
       }
    }
    public String[] toArray(){//8.将链表以对象数组返回
       if(this.root == null){
          return null;
       }else{
          this.foot = 0; //需要角标控制
          this.retArray = new String[this.count]; //根据来保存内容开辟数组
          this.root.toArrayNode(); //交给Node类处理
          return this.retArray;
       }
    }
}
//main方法=====================================
public class Linked{
    public static void main(String[] args){
       Link all = new Link();
       all.add("a");
       all.add("b");
       all.add("c");
       all.add("e");
       String [] data = all.toArray();
       for(int i = 0;i < data.length;i++){
          System.out.println(data[i]);
       }
    }
}
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消