LinkedList源码分析(二)

## LinkedList源码分析(二)
 /**
     * 检查下标是否正常
     *
     * @param index
     */
    private void checkIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("下标异常" + index);
        }
    }

    /**
     * 检查下标是否合法 用于添加元素
     *
     * @param index
     */
    private void checkIndexAdd(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("下标异常" + index);
        }
    }

    /**
     * 检查截取新集合下标是否正常
     *
     * @param start 开始下标
     * @param end   终止下标
     */
    private void checkSubIndex(int start, int end) {
        if (start >= end) {
            throw new IndexOutOfBoundsException("下标异常,正确下标 start < end");
        }
        checkIndex(start);
        checkIndex(end);
    }

    /**
     * 取消链表中某一元素的prev next引用  将指定元素t出链表结构中 将该元素的前后连接元素连接到一起
     *
     * @param x 要取消的元素
     * @return 返回被取消的元素
     */
    E unlink(Node<E> x) {
        final E element = x.item;//用来保存要取消连接的数据
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;
        //判断prev是否为空来确定是否是第一个元素
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;//被取消元素前一个元素的next引用重新指向
            x.prev = null;//清除被取消元素的prev引用
        }
        //判断next是否为空来确定是否是最后一个元素
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;//被取消元素的后一个元素的prev引用重新指向
            x.next = null; // 清空被取消元素的next引用
        }
        x.item = null;//清空数据
        size--;
        return element;
    }

    /**
     * 获取指定下标元素
     *
     * @param index 指定下标
     * @return Node<E>元素
     */
    Node<E> node(int index) {
        if (index < size / 2) {
            //当下标小于1/2size时,从first遍历
            Node<E> temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
            return temp;
        } else {
            //当下标大于1/2size时,从last遍历
            Node<E> temp = last;
            for (int i = size - 1; i > index; i++) {
                temp = temp.prev;
            }
            return temp;
        }
    }
}
上一篇:el-pagination分页-自定义左右箭头样式


下一篇:蓝桥杯 PREV-5 错误票据(排序+连续输入未知个数数据)