链表实现简介
链表的本质是一个动态的对象数组,它可以实现若干个对象的存储。
链表的基本定义:
在实际的开发之中对象数组是一项非常实用的技术,并且利用其可以描述出“多”方的概念,例如:一个人有多本书,则在人的类里面一定要提供有一个对象数组保存书的信息,但是传统的对象数组依赖于数组的概念,所以数组里面最大的缺点在于:长度是固定的,正是因为如此所以在实际的开发之中,传统的数组应用是非常有限的(数组的接收以及循环处理),但是如果要想进行灵活的数据保存,那么就必须自己来实现结构。
传统对象数组的开发操作依赖于脚标(索引)的控制,如果要想实现内容的动态维护,那么难度太高了,而且复杂度攀升,所以现在就可以发现,对于一成不动的数据可以使用对象数组来实现,但是对于可能随时变化的数据就必须实现一个可以动态扩充的对象数组。
所谓的链表实质性的本质是利用引用的逻辑关系来实现类似于数组的数据处理操作,以一种保存“多”方数据的形式,实现数组类似的功能。
通过分析可以发现,如果要想实现链表处理,那么需要一个公共的结构,这个结构可以实现数据的保存以及下一个连接的指向,为了描述这样的逻辑,可以把每一个存储理解为一个节点,但是此时应该准备出一个节点类,但是这个节点类可以保存有各种数据类型的数据。
虽然已经清楚了需要通过Node节点来进行数据的保存,但是毕竟这里面需要牵扯到节点的引用处理关系,那么这个引用处理关系是由使用者控制吗?
范例:直接操作Node很麻烦
class Node<E> {
private E data ;
private Node next ;
public Node(E data){
this.data = data ;
}
public E getData(){
return this.data ;
}
public void setNext(Node<E> next){
this.next = next ;
}
public Node getNext(){
return this.next ;
}
}
public class StringDemo {
public static void main(String args[]){
Node<String> n1 = new Node<String>("火车头") ;
Node<String> n2 = new Node<String>("车厢一") ;
Node<String> n3 = new Node<String>("车厢二") ;
Node<String> n4 = new Node<String>("车厢三") ;
Node<String> n5 = new Node<String>("车厢四") ;
n1.setNext(n2) ;
n2.setNext(n3) ;
n3.setNext(n4) ;
n4.setNext(n5) ;
print(n1) ;
}
public static void print(Node<?> node){
if (node != null){
// 有节点
System.out.println(node.getData()) ;
print(node.getNext()) ; // 递归调用
}
}
}
这样肯定不可能,所以应该有一个专门的类来进行节点的配置。因为真实的使用者实际上关心的只是数据的存储与获取,所以现在应该重新对Node类进行包装处理。
数据增加:public void add(E e)
通过之前的分析可以发现在进行链表操作的过程之中为了避免转型的异常应该使用泛型,同时也应该设计一个链表的标准,同时具体实现该接口的时候还应该通过Node类做出节点的关系描述。
范例:基本结构
interface ILink<E> {
// 设置泛型避免安全隐患
public void add(E e) ;
}
class LinkImpl<E> implements ILink<E> {
private class Node {
// 保存节点的数据关系
private E data ; // 保存的数据
private Node next ; // 保存下一个引用
public Node(E data){
// 有数据的情况下才有意义
this