链表在进行定义时使用了泛型技术,这样就可以保证每个链表所保存的相同类型的数据,这样既可以避免ClassCastException安全隐患,又可以保证在进行对象比较时的数据类型统一。
链表是多个节点的集合,所以在链表类中为了可以方便的进行所有节点的操作,则需要进行根节点(第一个保存的节点)的保存,每一次增加的新节点都要依照顺序保存在最后一个节点后进行存储。
1、【ILink】在ILink接口中定义数据增加的方法
* 向链表中进行数据的存储,每个链表所保存的数据类型相同,不允许保存null数据
* @param e 要保存的数据
*/
public void add(E e);
}
2、【Link.Node】每当进行链表数据增加时都需要创建新的Node类对象,并且需要依据引用关系保存Node类对象,此操作可以交由Node类完成,所以在Node类中追加节点保存方法。
/**
* 保存新创建的 节点,保存的依据是判断当前节点的next属性是否为空
* @param newNode 要保存的新节点
*/
public void addNode(Node<E> newNode) { //保存新的Node数据
if(this.next==null) { //当前节点的下一个节点为空
this.next=newNode; //保存当前节点
}else {
this.next.addNode(newNode); //递归到合适的位置保存数据
}
}
}
3、【Link】链表实现子类定中定义根节点对象
private Node<E> root; //保存根节点信息
4、【Link】在子类中覆写ILink接口中定义的add()方法。
@Override
public void add(E e) { //方法覆写
if(e==null) { //保存的数据为空时
return; //方法调用直接结束
}
//数据本身不具有节点先后的关联特性,要想实现关联处理就必须将数据包装在Node类中
Node<E> newNode=new Node<E>(e); //创建一个新的节点
if(this.root==null) { //现在没有根节点
this.root =newNode; //第一个节点作为根节点
}else { //根节点存在
this.root .addNode(newNode); //有Node类保存新节点
}
}
在Link子类中主要功能是将要保存在链表中的数据包装在Node类对象中,这样就可以利用Node类中所提供的next属性来定义不同Node类对象间的先后关系。在链表实现中最为重要的就是根节点的保存,即通过根节点可以实现所有后续节点的处理,本程序将第一个保存的节点作为根节点。
5、【测试类】在主类中进行链表数据的保存
public class LinkDome277 {
public static void main(String[] args) {
ILink<String> link=new Link<String>(); //实例化链表对象
link.add("www.链表数据增加.com"); //链表中保存数据
link.add("www.kkk.cm"); //链表中保存数据
link.add("www.lll.cn"); //链表中保存数据
}
}
在客户端使用时可以利用子类对象的向上转型为ILink父类接口对象实例化,这样就可以直接调用add()方法进行链表数据存储,由于链表了实现了所有节点的创建与引用处理,所以客户端不必关心Node类的操作。