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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值