LinkedList源码分析(四)

## LinkedList源码分析(四)
/**
     * 添加一个符合当前LinkedList泛型约束数据类型一致的元素带结婚中
     *
     * @param e 符合LinkedList 要求的元素
     * @return 添加成功返回true
     */
    public boolean add(E e) {
        // 最后一个节点位置,当前元素保证成Node节点之后的存储位置
        Node<E> l = last;

        // 创建得到一个新的Node节点
        Node<E> newNode = (Node<E>) new Node<>(l, e, null);

        // 因为当前元素需要保存到LinkedList结尾 last一定要被赋值newNode
        last = newNode;

        // 第一个有效节点时,first同时指向当前节点
        if (null == first) {
            first = newNode;
        } else {
            // 原本最后一个节点next指向新的newNode
            l.next = newNode;
        }

        // 有效元素 += 1
        size += 1;

        return true;
    }

    /**
     * 同是尾插法操作
     *
     * @param e 符合泛型约束的具体数据类型
     * @return 返回插入状态
     */
    public boolean addLast(E e) {
        return add(e);
    }

    /**
     * 在LinkedList链表头添加一个元素
     *
     * @param e 符合泛型约束的具体数据类型
     * @return 返回插入状态
     */
    public boolean addFirst(E e) {
        /*
         *三个地址:
         *      1. LinkedList链表头 first ==> newNode
         *      2. newNode --> next --> old FirstNode
         *      3. old FirstNode.prew --> newNode
         */
        // 原始的first节点
        Node<E> f = first;

        // 创建新的newNode
        Node<E> newNode = new Node<>(null, e, f);

        // LinkedList链表头内的first一定执行newNode
        first = newNode;

        if (null == first) {
            last = newNode;
        } else {
            // 原始的first节点,prev赋值为newNode
            f.prev = newNode;
        }

        size += 1;

        return true;
    }

    /**
     * 在指定下标位置插入指定元素
     *
     * @param index 指定下标位置
     * @param e     要插入的元素
     * @return 插入成功返回true
     */
    public boolean add(int index, E e) {
        checkIndex(index);
        if (index == size) {
            addLast(e);
            return true;
        } else if (index == 0) {
            addFirst(e);
        } else {
            unlinkAdd(e, node(index));
        }
        return true;
    }

    /**
     * 向除头尾插入元素的实际方法
     *
     * @param e    插入的元素
     * @param node 更新链的元素
     */
    private void unlinkAdd(E e, Node<E> node) {
        Node<E> prev = node.prev;
        Node<E> newNode = new Node<>(prev, e, node);
        prev.next = newNode;
    }

上一篇:二叉树前序非递归遍历


下一篇:复制带随机指针的链表【php版】