LinkedList源码分析

//初始化一个空的列表
public LinkedList() {
}
//添加一个特定的元素到列表的末尾
public boolean add(E e) {
        linkLast(e);
        return true;
}
//定义末尾结点last
transient Node<E> last;
//链接e作为最后一个元素
void linkLast(E e) {
	//原末尾结点作为该结点的前一个结点,注意这里使用的是对象引用,拿到了内存地址,相当于指针
	final Node<E> l = last;
	//该结点的下一个结点置为空
	//构造一个新结点
	final Node<E> newNode = new Node<>(l, e, null);
	//对象引用,当前结点成为末尾结点
	last = newNode;
	//假如是一个空链表,则将新结点作为首结点
	if (l == null)
		first = newNode;
	else
		//将原末尾结点指向新结尾结点
		//这里可以看出Java中的链表使用的是双向链表
		l.next = newNode;
	//链表的Size+1
	size++;
	//检测到并发性的标识
	modCount++;
}
//结点类
private static class Node<E> {
		//元素
        E item;
		//下一个结点
        Node<E> next;
		//前一个结点
        Node<E> prev;
		//结点的构造函数
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
}

//删除此列表中指定位置的元素。 
//转移任何左边的后续元素(从索引中减去一个)。
//返回从列表中删除的元素。
public E remove(int index) {
	checkElementIndex(index);
	return unlink(node(index));
}
//在数组访问之前使用,检查索引是否越界
private void checkElementIndex(int index) {
        if (!isElementIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private boolean isElementIndex(int index) {
        return index >= 0 && index < size;
}
//返回指定元素索引处的(非null)节点。
Node<E> node(int index) {
        // assert isElementIndex(index);
		//这里可以看出,在根据索引获取指定元素时,将整个链表从中间分成前后两个部分
		//这是前一部分
        if (index < (size >> 1)) {
			//从首元素开始,向后遍历,一直next
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
			//后部分从末尾遍历
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
}
// 删除链表中的一个结点
E unlink(Node<E> x) {
        // assert x != null;
		// 获取将要删除结点的值
        final E element = x.item;
		// 获取将要删除结点的下一个结点
        final Node<E> next = x.next;
		// 获取将要删除结点的前一个结点
        final Node<E> prev = x.prev;
		
		// 若删除首结点,则将下一个结点作为首结点
        if (prev == null) {
            first = next;
        } else {
			//非首结点
			//前一个结点的指向后一个结点(前后之间隔了一个结点)
            prev.next = next;
			//当前元素的prev指针置空
            x.prev = null;
        }
		// 若删除尾结点,则将前一个结点作为尾结点
        if (next == null) {
            last = prev;
        } else {
			//后一个结点指向前一个结点
            next.prev = prev;
			//当前结点指向null
            x.next = null;
        }
		//当前结点值置为null,便于GC回收
        x.item = null;
		//Size-1
        size--;
		//检测到并发性的标识
        modCount++;
        return element;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值