链表

一、链表的概念

链表属于一种数据结构,链表可以保存多个数据,以节点的形式出现,每个节点都可以保存数据,而且每个节点除了可以保存数据之外还必须有对下一个节点的引用。

  • 链表的最佳输出方式:
    链表的最佳输出方式是递归。
public class Test {
    public static void main(String[] args) {
        //创建出节点
         Node<String>   root=new Node<String >("火車頭");
         Node<String>   n1=new Node<String >("车厢A");
         Node<String>   n2=new Node<String >("车厢B");
         Node<String>   n3=new Node<String >("车厢C");
         //维护节点之间的关系
        root.setNextNode(n1);
        n1.setNextNode(n2);
        n2.setNextNode(n3);
        //调用递归方法输出节点数据
        print(root);
    }
    /**
     *  递归输出节点数据
     * @param currentNode
     */
    public  static  void  print(Node  currentNode){
         if(currentNode==null){
             return ;
         }
        System.out.print(currentNode.getData()+"--->");
        print(currentNode.getNextNode());
    }
}

以上这段代码对节点的操作都是在主方法中实现,也就是节点的创建、关系维护、输出都是在出方法中实现的,我们说过主方法是客户端,在客户端要求代码尽可能的简洁,不要出现这些复杂的操作,后面我们会将这些操作封装隐藏不出现在主方法中。

二、链表的操作

  • 需要使用一个中间类来维护客户端和节点之间的交互,和二叉树很类似,节点是被封装到一个BinaryTree中了,那么这个外部类BinaryTree就是节点和客户端之间的一个中间类,客户端不能直接操作节点的类,而是通过BinaryTree类去操作。
class  Node<T>{
      private  T data;
      private  Node  nextNode;
      public   Node(){
      }
      public   Node(T  data){
          this.data=data;
      }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    public Node getNextNode() {
        return nextNode;
    }
    public void setNextNode(Node nextNode) {
        this.nextNode = nextNode;
    }
    //添加节点数据
    public   void  addNewNode(Node<T>  newNode){
          //判断当前节点的下一个节点是否为null
         if(this.nextNode==null){
             this.nextNode=newNode;
         }else{
              this.nextNode.addNewNode(newNode);
         }
    }
    //输出节点的数据
    public  void   printNode(){
        System.out.println(this.data);
        if(this.nextNode!=null){
            this.nextNode.printNode();
        }
    }
}
//定义出Link类
class Link<T>{
    private  Node<T> root;//表示链表的根节点
    int foot=0;// 用来记录节点的下标
    /**
     * Link中的添加数据的方法
     * @param data
     */
    public  void  add(T data){
        Node<T>  newNode=new Node<T>(data);
        if(this.root==null){
            this.root=newNode;
        }else{
          this.root.addNewNode(newNode);
        }
    }
    /**
     * 输出数据
     */
    public  void  print(){
         if(this.root==null){
             return ;
         }else{
             this.root.printNode();
         }
    }
}
public class Test {
    public static void main(String[] args) {
        //添加数据
        Link<String>  link=new Link<String>();
        link.add("JavaScript开发大全");
        link.add("数据库从删库到跑路");
        link.add("Java从入门到放弃");
        link.add("毛泽东思想概论");
        //输出数据
        link.print();
    }
}

三、将Node设置为内部类

  • 让Node类依赖Link存在
  • 内部类可以很方便的访问外部类的私有属性
    定义Node为内部类的代码:
package com.sun;
//定义出Link类
class Link<T>{
    private class  Node<T>{ //定义了内部类
        private  T data;
        private  Node  nextNode;
        public   Node(){
        }
        public   Node(T  data){
            this.data=data;
        }
        public T getData() {
            return data;
        }
        public void setData(T data) {
            this.data = data;
        }
        public Node getNextNode() {
            return nextNode;
        }
        public void setNextNode(Node nextNode) {
            this.nextNode = nextNode;
        }
        //添加节点数据
        public   void  addNewNode(Node<T>  newNode){
            //判断当前节点的下一个节点是否为null
            if(this.nextNode==null){
                this.nextNode=newNode;
            }else{
                this.nextNode.addNewNode(newNode);
            }
        }
        //输出节点的数据
        public  void   printNode(){
            System.out.println(this.data);
            if(this.nextNode!=null){
                this.nextNode.printNode();
            }
        }
    }
    //以下代码是外部类中的代码
    private  Node<T> root;//表示链表的根节点
    int foot=0;// 用来记录节点的下标
    /**
     * Link中的添加数据的方法
     * @param data
     */
    public  void  add(T data){
        Node<T>  newNode=new Node<T>(data);
        if(this.root==null){
            this.root=newNode;
        }else{
          this.root.addNewNode(newNode);
        }
    }
    /**
     * 输出数据
     */
    public  void  print(){
         if(this.root==null){
             return ;
         }else{
             this.root.printNode();
         }
    }
}
public class Test {
    public static void main(String[] args) {
        //添加数据
        Link<String>  link=new Link<String>();
        link.add("JavaScript开发大全");
        link.add("数据库从删库到跑路");
        link.add("Java从入门到放弃");
        link.add("毛泽东思想概论");
        //输出数据
        link.print();
    }
}
  • 取得链表长度的方法
 /**
     * 取得链表长度
     * @return
     */
    public  int  size(){
        return this.count;
    }
}
  • 判断链表是否为空:
* @return  如果为空返回  true   否则就是返回false
 */
public   boolean  isEmpty(){
    return  this.count==0;
}
  • 在外部类增加方法:
public class Test {
    public static void main(String[] args) {
        //添加数据
        Link<String>  link=new Link<String>();
        link.add("JavaScript开发大全");
        link.add("数据库从删库到跑路");
        link.add("Java从入门到放弃");
        link.add("毛泽东思想概论");
        //输出数据
        System.out.println("链表长度是:"+link.size());
        System.out.println("链表是否为空:"+link.isEmpty());
    }
}
  • 判断链表是否包含指定对象
/**
 *  判断链表中是否包含指定的对象
 * @param data  需要判断的对象
 * @return  如果包含则返回true  否则就是返回false
 */
public  boolean   containsNode(T data){
     if(this.data.equals(data)){
          return true;
     }else{
          if(this.nextNode==null){
              return false;
          }else{
             return    this.nextNode.containsNode(data);
          }
     }
}
  • 根据索引取得节点数据
/**
 * 根据索引取得节点数据
 * @param index  节点的索引
 * @return
 */
public  T  getNode(int index){
     if(foot++==index){
         return  this.data;
     }
     if(this.nextNode==null){
         return  null;
     }
     return  (T)this.nextNode.getNode(index);
}
  • 内部类中定义方法
 /**
 * 根据索引查询数据
 * @param index
 * @return
 */
private  int  foot=0;
public   T  get(int  index){
     if(this.root==null){
         return null;
     }
     if(index>this.count-1||index<0){
         return null;
     }
     this.foot=0;
     return  this.root.getNode(index);
}
  • 外部类中定义方法
public class Test {
    public static void main(String[] args) {
        //添加数据
        Link<String>  link=new Link<String>();
        link.add("JavaScript开发大全");
        link.add("数据库从删库到跑路");
        link.add("Java从入门到放弃");
        link.add("毛泽东思想概论");
        //输出数据
        System.out.println(link.get(0));
        System.out.println(link.get(1));
        System.out.println(link.get(3));
    }
}
  • 修改链表中的数据
/**
 * 修改数据
 * @param index  要修改的数据的下标
 * @param data   新的数据
 */
public   void  setNode(int  index,T data){
    if(foot++ ==  index){
         this.data=data;
    }else{
        this.nextNode.setNode(index,data);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值