闲暇之余,准备将Java 一些常用的数据结构进行重新的剖析,并记录博客比如LinkedList ,HashMap ,HashTable ,以及并发包所引入的集合,在博客中会陆续更新

start

哈哈,引入一张图片,链子,我们生活中常见,我们可以看到每一个扣的前后都是扣,串了起来,我们把每一个扣当作成一个数据,许多数据串在了一起就形成了

数据链集合,就是LinkedList ,我们拿掉一个扣,势必会将这个扣的前后两个扣进行重新整合,就形成了新的数据链,这么想,是不是感觉会透彻呢;

既然是一个链子,那么势必在链子的每一个数据中都维护着当前数据的上下对象数据,也就是说我这个扣需要知道我的两端是被那个扣绑着呢吧

1.所以在LinkedList 中存在一个节点对象,用于进行标示元素的上下元素Node ,如下:(想不通就想狗链子😁)

  private static class Node<E> {
        E item; //插入的元素对象
        Node<E> next;//元素的下一个节点
        Node<E> prev;//元素的上一个节点
    //Node 构造函数,进行链表操作
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

2.在LinkedList 中,维护着整个链表集合的第一位元素和最后一位元素,以及数量,这些都是随着数据的增加删除所动态修改的

//当前LinkedList的数量 
transient int size = 0;

    /**
    * 当前list的第一位元素
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
    *当前list 的最后一位元素
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

到这里,我们有了构造数据的上下数据对象Node 以及数据链中的第一位元素对象,以及最后一位元素对象,是不是就会很轻松的实现自己的一个数据链;好好想;

add 操作的思路:

(一).添加的元素上节点肯定的last Node

  (二).添加的元素如果不指定特殊位置,会放置在链表最后,所以添加后该元素的下节点肯定是null

自己实现的代码:

//集合添加元素的操作
    public void add(Object e) {
         Node l =last;
        //新添加的元素开头是last,下节点为null,
        Node newNode = new Node(l,e,null);
        //添加成功,那么将它作为最后一个元素
        last= newNode;
        if(l==null) {
            first =newNode;
        }else {
      //不仅要将新元素绑定上下Node,因为链表是双向的,也要将上一个Node 绑定下节点(因为每添加一个元素都是位于链表最后,它的下节点没有指向的)
            l.next =newNode;
        }
        size++;
    }

 

posted on 2018-11-23 22:45  iscys  阅读(108)  评论(0编辑  收藏  举报