【Java集合源码解析】LinkedList

通过阅读源码 熟悉API-LinkedList-基于jdk1.8

描述

  1. 基于内部类Node实现
增加
public void addFirst(E e){
    //只将原来的first的前一个连接到新节点
    //没有将新节点的后一个连接原节点
    final Node<E> f = first;
    f.prev = newNode;
}
public void addLast(E e){
    final Node<E> l = last;
    //不为null,将老节点后一个进行连接
    l.next = newNode;
}
//追加至末尾,与addLast相同
public boolean add(E e)
//追加至末尾,与add相同
public boolean offer(E e)
//调用addFirst
public boolean offerFirst(E e) 
//调用addLast
public boolean offerLast(E e)
//追加至末尾,与add相同
public void push(E e)

public boolean addAll(int index, Collection<? extends E> c){
        if (index == size) {
            //追加至最后,将当前最后一个座位pred
            succ = null;
            pred = last;
        } else {
            //找到索引为index的节点
            succ = node(index);
            pred = succ.prev;
        }
        for (Object o : a) {
            E e = (E) o;
            Node<E> newNode = new Node<>(pred, e, null);
            if (pred == null)
                //指定的索引所在节点为first,所有pred为null
                //将新的节点作为first
                first = newNode;
            else
                //将新节点作为指定索引前一个节点的下一个节点
                //即将新节点放置在指定索引节点的前面
                pred.next = newNode;
            //新节点作为前一个节点
            //继续添加新节点的时候,是放在同一个集合的节点的后面
            //指定索引节点的前面
            pred = newNode;
        }
        //在循环后,pred已经是要添加的最新的节点了
        if (succ == null) {
            //索引位置的节点为null,则需要在最后将集合进行追加
            //集合中最后遍历到的元素就是last
            //pred在前面的循环中已经确定,是要添加的最新node
            last = pred;
        } else {
            //索引指定位置的节点为最后添加的节点的下一个
            pred.next = succ;
            //同理,指定位置的节点的前一个,也即为当前节点
            succ.prev = pred;
        }
}
//追加至末尾,与上addAll相同
public boolean addAll(Collection<? extends E> c)

public void add(int index, E element){
        if (index == size)
            //指定位置为链表长度,则将元素追加至最后
            linkLast(element);
        else
            //插入在指定索引的非空节点前面
            linkBefore(element, node(index));
}
删除
private E unlinkFirst(Node<E> f){
        if (next == null)
            //如果一下一个为null,说明链表只有一个元素
            //则将链表的最后一个也至为null
            last = null;
        else
            //如果存在下一个,则将下一个的前一个至为null,即断链
            next.prev = null;
}
//第一个节点不为null,则调用unlinkFirst将其断连
public E removeFirst()
//调用unlinkLast,与unlinkLast同理
public E removeLast()
public boolean remove(Object o){
    //如果o为null,则将链表中找到的第一个item为null的元素移除
    //否则移除第一个值为o的元素
    //通过调用unlink进行断链
}
public void clear(){
    for (Node<E> x = first; x != null; ) {
        Node<E> next = x.next;
        //通过循环,从first开始,将所有节点置为null
        //同时先将next节点作为下一次的循环操作的节点x
        x = next;
    }
}
public E remove(int index){
    //根据索引获取到指定节点
    node(index)
    //再通过unlink进行断链
}
//调用removeFirst,即从链表首移除元素
public E remove()
//调用remove(Object o),即从左到有,移除第一个与o相等的元素
public boolean removeFirstOccurrence(Object o)

public boolean removeLastOccurrence(Object o){
    //从最后一个节点向前循环就,移除发现的第一个元素
    for (Node<E> x = last; x != null; x = x.prev) {
        if (x.item == null) {
            unlink(x);
            return true;
        }
    }
}
修改
public E set(int index, E element){
    //通过node()找到节点后,直接将其item置为指定值
    x.item = element;
}
查找
//如果first节点不为null,则返回first节点
public E getFirst()
//如果last节点不为null,则返回last节点
public E getLast()
//调用indexOf(o)查找链表中是否存在有等于某个值的元素
public boolean contains(Object o)
//校验索引是否合法后,通过node(index)返回元素的值(item)
public E get(int index)
//循环判断后进行返回索引值,没有找到返回-1
public int indexOf(Object o) 
public int lastIndexOf(Object o)
//检索获取链表第一个头元素,不移除它
//如果为null则返回null
public E peek()
//检索获取链表第一个头元素,不移除它
//如果为null则抛出NoSuchElementException
public E element()
//与peek相同
public E peekFirst()
//检索获取链表最后一个元素,不移除它
//如果为null则返回null
public E peekLast()
//检索获取第一个元素,并移除它
//如果为null,则返回null
public E poll()
//与poll相同
public E pollFirst()
//检索获取第一个元素,并移除它
//如果为null,则返回null
public E pollLast()
//检索获取第一个元素,并移除它
如果为null则抛出NoSuchElementException
public E pop()
其他
public ListIterator<E> listIterator(int index)
//
public Iterator<E> descendingIterator()
//注意与Iterator的区别
private class ListItr implements **ListIterator**<E>{
    public E next() {
        lastReturned = next;
        next = next.next;
        nextIndex++;
        return lastReturned.item;
    }
    public void add(E e)
    public void set(E e)
    public boolean hasPrevious()
    public E previous()

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值