链表
链表是一种动态线性结构,与数组相比链表最大的特点是可以不受到长度的限制。
链表(动态数组)的本质是利用对象引用的逻辑关系来实现类似于数组的数据存储逻辑,一个链表上由若干个节点(Node)所组成,每一个节点依靠对上一个节点的引用形成一个“链”的形式
Node类结构
数组本身是需要进行多个数据的信息保存,但是数据本身并不能够描述出彼此间的先后顺序,所以就需要将数据包装在节点(Node)之中,每一个节点除了要保存数据信息之外,一定还要保存有下一个节点(Node)的引用,而在链表之中会保存有一系列的节点对象
范例:直接使用Node类存放多个数据
public class Node274<E> { //定义节点类保存数据和节点引用
private E data; //节点保存数据
private Node274<E> next; //节点保存数据
public Node274(E data) { //创建节点时保存数据
this.data=data;
}
public E getData() { //获取数据信息
return this.data ;
}
public Node274<E> getNext() { //设置节点引用
return next;
}
public void setNext(Node274<E> next) { //返回节点
this.next = next;
}
}
public class LinkDemo274 {
public static void main(String[] args) {
Node274<String> n1=new Node274<String>("火车头");//定义节点对象
Node274<String> n2=new Node274<String>("车厢一");//定义节点对象
Node274<String> n3=new Node274<String>("车厢二");//定义节点对象
Node274<String> n4=new Node274<String>("车厢三");//定义节点对象
Node274<String> n5=new Node274<String>("车厢四");//定义节点对象
n1.setNext(n2); //设置节点引用
n2.setNext(n3); //设置节点引用
n3.setNext(n4); //设置节点引用
n4.setNext(n5); //设置节点引用
printNode(n1); //输出节点信息
}
public static void printNode(Node274<?> node) { //从头输出全部节点
if(node!=null) { //当前节点存在
System.out.println(node.getData()+"、"); //输出节点顺序
printNode(node.getNext()); //递归调用,输出后续节点内容
}
}
}
执行结果
火车头、车厢一、车厢二、车厢三、车厢四、
本程序直接利用节点的引用关系,将若干个Node类的对象串联在一起,这样在进行数据获取时只需根据引用逻辑,从第一个节点开始利用递归逻辑向后一直输出即可。
上图中,为了方便链表类中对于数据的保存,将Node类设计为了一个内部类的形式,目的是让Node
类只为LinkImpl一个类服务,这样就可以形成以下的链表基本模型。
范例:定义链表的基本模型
public interface ILink<E> { //链表公共标准
//在此处定义若干链表操作方法
}
public class Link<E> implements ILink<E> {
//使用内部类的结构进行定义,这样外部类与内部类可以直接进行私有成员访问
private class Node<E>{ //内部类封装,对外部不可用
private E data; //节点保存数据
private Node<E> next; //保存节点引用
public Node(E data){ //创建节点时保存数据
this.data =data;
}
}
}
ILink接口主要方法