【数据结构】2.java源码关于LinkedList
| 副标题[/!--empirenews.page--] 
 关于LinkedList的源码关注点
 ? 1.从底层数据结构,扩容策略构造函数不做任何操作,只要再add的时候进行数据初始化操作,以操作推动逻辑,而且linkedlist是一个双向链表,所以可以向前向后双向遍历 ? 
 ? 
 ? ?2.LinkedList的增删改查?2.1 add操作,linklast? Add操作的实质就是进行linklast操作 linklast的操作就是再最后吧节点添加到尾部,并修正size大小 ? 
 ? ?     public boolean add(E ele) {
        linkLast(ele);
        return true;
    }? 我们看看如果是在指定的位置插入元素的操作 ?先看看node定位操作 ? 
 ? ?然后我们看看linkbefore,前置插入 ? public void linkBefore(E e,Node<E> succ) {
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred,e,succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }那么我们需要插入到指定的位置的方法就可以很简单的实现了 ? 
 2.2 删除? 查看源码,比较remove(),remove(object),remove(index)等等操作,归根到底还是一个unlink操作 ? ? public E unlink(Node<E> node) {
        // assert x != null;
        //这里需要操作的就是三个节点,前置节点,当前节点,后置节点
        final E element = node.item;
        final Node<E> prev = node.prev;
        final Node<E> next = node.next;
        //当前节点的前一个节点指向当前节点的下一个节点,说白了node.pre.next = node.next;
        if (prev == null) {
            //避免首节点操作
            first = next;
        } else {
            prev.next = next;
            node.prev = null; //断开原始连接
        }
        //当前节点的下一个节点的前置节点指向当前节点的上一个节点:node.next.pre = node.pre;
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            node.next = null;
        }
        //清除当前节点
        node.item = null;
        size--;
        modCount++;
        return element;
    }其余操作基本就是调用unlink方法进行操作 
 ? ?修改set和获取get就不多说了,就注意一点就是set操作的时候,会返回旧值,并且这两个操作不会修改modCount值,也就是不会产生链表变动 ? ?3.特殊处理重点关注,iterator,序列化? ? 对于iterator这个就不多说了,其实还是调用上面的那些方法,遍历也就是next和pre和循环遍历没差别 
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 






