链表基本概念和实现

1. 链表的基本形式

   链表是一种最为简单的数据结构,它的主要目的是依靠引用关系来实现多个数据的保存。

   链表由一个个节点组成,下面我们来定义一个节点类

class Node {
   private String data;//要保存的数据
   private Node next;//要保存的下一个节点
   //每一个Node类对象都必须保存有相应的数据
   public Node(String data){
      this.data =data;
   }
   public void setNext(Node next){
      this.next =next;
   }
   public Node getNext(){
       return this.next;
   }
   public String getData(){
       return this.data;
   }
}
以上只是一个专门保存节点关系的类,但是怎么保存关系,并不是Node类执行。
范例:使用第一种形式设置和取出数据
public class LinkDemo{
public static void main(String args[]){
  //第一步:准备出所有数据
    Node root = new Node("火车头");
    Node n1 = new Node("车厢A");
    Node n2 = new Node("车厢B");
    root.setNext(n1);
    n1.setNext(n2);
  //第二步:取出所有数据
  Node currentNode = root;//当前从根节点开始读取
  while (currentNode != null){
System.out.println(currentNode.getData());
将下一个节点设置为当前节点
currentNode = currentNode.getNext();
           }
        }
}
实际上以上操作使用的循环并不方便,最好还是应该使用递归操作完成,递归更加直白。
范例:使用第二种形式设置和取出数据

public class LinkDemo{
public static void main(String args[]){
  //第一步:准备出所有数据
    Node root = new Node("火车头");
    Node n1 = new Node("车厢A");
    Node n2 = new Node("车厢B");
    root.setNext(n1);
    n1.setNext(n2);
    print(root);
           }
        public static void print(Node current){
      if (current == null){//递归结束条件
 return ;//结束方法
               }
System.out.println(current.getData());
print(current.getNext());
        }
}
疑问? 整个过程完成的功能就是一个设置数据和取数据的过程,为什么需要Node呢?

      由于数据本身不具备先后的关系,所以使用Node类来封装数据,同时利用Node类来指向下一个节点。


2.链表的基本雏形

通过分析发现:用户在操作的过程中完全没有必要去关心Node类是否存在;所有的节点的引用关心不应该由用户处理,应该有一个专门的工具类去处理。

下面需要定义一个Link类,来帮助客户端去隐藏所有的链表中给出的细节操作。
class Node {
   private String data;//要保存的数据
   private Node next;//要保存的下一个节点

   //每一个Node类对象都必须保存有相应的数据
   public Node(String data){
      this.data =data;
   }
   public void setNext(Node next){
      this.next =next;
   }
   public Node getNext(){
       return this.next;
   }
   public String getData(){
       return this.data;
   }
   //实现节点的添加
   //第一次调用(Link):this = Link.root
   //第二次调用(Node): this = Link.root.next
   //第三次调用(Node): this = Link.root.next.next
   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
    //第三次调用(Node): this = Link.root.next.next
   public void printNode(){
System.out.println(this.data);//输出当前节点的数据
if(this.next != null){ //现在还有下一个节点
   this.next.printNode();//输出下一个
}
   }
}


class Link{//负责Node类对象的关系处理
        private Node root;//根节点
public void add(String data){ //增加数据
     //为了设置数据的先后关系,所以将data包装在Node类中
     Node newNode = new Node(data);
     if(this.root == null){
  this.root = newNode;
}else{//根节点已经存在了
  //随后后面增加的元素应该交由节点来决定
   this.root.addNode(newNode);
}
}
        public void print(){//输出数据
 if  (this.root != null){//现在存在根节点
               this.root.printNode();//交给Node类输出
  }
}
}
public class LinkDemo{
public static void main(String args[]){
     link link = new Link();
     link.add("Hello");
     link.add("World");
     link.add("Welcome");
     link.add("You");
     link.print();//展示数据
}
}
通过以上的代码,可以发现链表的基本操作特点:
a. 客户端不用去关注具体的Node以及引用关系的细节,只关注提供数据和取出数据;
b. Link类的主要功能是控制Node类对象的产生和根节点;
c. Node类主要负责数据的保存以及引用关系的分配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值