Java入门:15.泛型特点,定义,确定,通配符与边界,链表容器封装设计-002

2 链表容器的封装

2.1 链表存储结构的特点

  • 不同与数组结构

  • JDK中没有专门的链表存储技术

  • 需要通过多个节点对象手拉手(地址引用,指针连接)完成链表结构的存储

  • 意味着链表结构有很多节点对象,节点对象有什么特点?

    1. 是一个类对象

    2. 节点对象要能存储链表中的一个元素 。

      对于数组而言,一个元素存储在数组的一个位置

      对于链表而言,一个元素存储在链表结构中的一个节点中

    3. 节点对象中除了存储元素外,还需要存储另一个与之相邻的节点的地址

      随着一个节点和与之相邻节点之间的链接关系,链表结构又可以分为:

      • 单向链表 , 每一个节点只能找到相邻的下一个节点

      • 双向链表,每一个节点都能找到相邻的下一个和上一个节点

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 ;
    }
}

那么今天的内容就到这里啦,如果存在哪些疑问或问题欢迎大家指出,我们下期再见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值