2 链表容器的封装
2.1 链表存储结构的特点
-
不同与数组结构
-
JDK中没有专门的链表存储技术
-
需要通过多个节点对象手拉手(地址引用,指针连接)完成链表结构的存储
-
意味着链表结构有很多节点对象,节点对象有什么特点?
-
是一个类对象
-
节点对象要能存储链表中的一个元素 。
对于数组而言,一个元素存储在数组的一个位置
对于链表而言,一个元素存储在链表结构中的一个节点中
-
节点对象中除了存储元素外,还需要存储另一个与之相邻的节点的地址
随着一个节点和与之相邻节点之间的链接关系,链表结构又可以分为:
-
单向链表 , 每一个节点只能找到相邻的下一个节点
-
双向链表,每一个节点都能找到相邻的下一个和上一个节点
-
-
2.2 重写Box规则
Box规则
/**
* 作为容器的规则
* 1. 通过接口的语法特点,规定了所有具体的容器类都应该具备哪些方法
* 2. 通过接口中的注释文字,从逻辑上规定了每一个方法要实现的具体功能
*/
public interface Box<E> {
/**
* 允许添加一个元素
* 添加成功,return true
* 添加失败 return false
*/
boolean add(E e) ;
boolean add(E[] es) ;
boolean add(Box<? extends E> es);
int size();
void show() ;
Manager<E> getManager();
}
Manager规则
/**
* 指定了每一个容器内部,可以变量元素的管理器的规则
* 每一个容器都应该为使用者提供一个管理器,管理器可以帮助使用者遍历(依次获得)容器中的每一个元素
* 管理器应该有哪些方法,这些方法都有哪些功能,也需要准守一定的规则
*/
public interface Manager<E> {
boolean hasNext();
E getNext() ;
boolean hasPrev();
E getPrev();
E getFirst();
E getLast() ;
void reset();
}
新增IndexBox规则
/**
* 支持索引存储的容器要遵守的规则,例如:ArrayBox LinkedBox
*/
public interface IndexBox<E> extends Box<E> {
/**
* 在指定位置添加元素
* @param i
* @return
*/
boolean add(E e,int i) ;
boolean add(E[] es , int i) ;
boolean add(Box<? extends E> es,int i) ;
E get(int i);
E remove(int i);
}
2.3 设计LinkedList
2.3.1 链表容器与节点的基本设计
/**
* 底层使用双向链表结构存储
*/
public class LinkedBox<E> implements IndexBox<E> {
//记录头节点,就可以得到整个链表
private Node<E> first ;
//记录尾节点,也可以得到整个链表
private Node<E> last ;
//记录存储元素的数量(节点的数量)
int size ;
static class Node<T>{
//存储节点中的元素
T element ;
Node<T> next ;
Node<T> prev ;
public Node(){}
public Node(T element, Node<T> next, Node<T> prev) {
this.element = element;
this.next = next;
this.prev = prev;
}
}
//.....
}
2.3.2 add功能设计
@Override
public boolean add(E e) {
//添加元素,对于链表结构而言,每一个元素在链表中都是以节点的形式存储
Node<E> newNode = new Node<E>();
newNode.element = e ;
if(size == 0){
//链表中一个节点都没有
//当前这个节点,又是头节点,又尾节点
first = newNode ;
last = newNode ;
}else{
//链表中本身就有一些节点
//此时新节点应该放在之前那个last节点的后面
//放完之后,当前这个新节点就变成了last节点
last.next = newNode ;
newNode.prev = last ;
last = newNode ;
}
size ++ ;
return true;
}
2.3.3 show功能设计
@Override
public void show() {
//打印存储的所有元素
//所有的元素都在节点中存储
//怎么能得到所有的节点呢?
//可以从头结点,一个一个的往后找。也可以从尾节点一个一个的往前找
Node<E> curr = first ;
while(curr != null){
E e = curr.element;
System.out.println(e);
curr = curr.next ;
}
}
那么今天的内容就到这里啦,如果存在哪些疑问或问题欢迎大家指出,我们下期再见~