LinkedList源码解析(数据结构及底层实现)

Main.java

public class Main{
    public static void main(String[] args){
        LinkedList linkedList = new LinkedList<>();
        linkedList.add("a1");
        linkedList.add("a2");
        linkedList.remove("a1");//或linkedList.remove(0).删除a1节点
    }
}

LinkedList.java(源码,只提取操作中涉及的部分)

属性

public class LinkedList<E> extends AbstractSequentialList<E> 
implements List<E>, Deque<E>, Cloneable,java.io.Serializable {
    transient int size = 0;
    transient Node<E> first;
    // 指向最后一个结点
    transient Node<E> last;
}

构造方法

public class LinkedList<E> extends AbstractSequentialList<E> 
implements List<E>, Deque<E>, Cloneable,java.io.Serializable {
    public LinkedList() {
    }
    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }
}

add方法

public class LinkedList<E> extends AbstractSequentialList<E> 
implements List<E>, Deque<E>, Cloneable,java.io.Serializable {
    /**
     * 新增元素
     */
    // eg1: e="a1"
    public boolean add(E e) {
        linkLast(e);
        return true;
    }
    
    /**
     * 将新添加的元素e作为链表的最后一个元素, 并维护进去
     */
    // eg1: e="a1"
    void linkLast(E e) {
        final Node<E> l = last;
    
        // eg1: newNode    null<--"a1"-->null
        /** 创建一个e的Node节点,前置指向原last节点,后置指向null */
        final Node<E> newNode = new Node<>(l, e, null);
    
        /** 将newNode节点赋值为last节点 */
        last = newNode;
    
        // eg1: l=null
        if (l == null) {
            /** 如果是第一个添加的元素,则first指针指向该结点*/
            first = newNode; // eg1: first指向newNode
        } else {
            /** 如果不是第一个添加进来的元素,则更新l的后置结点指向新添加的元素结点newNode*/
            l.next = newNode;
        }
        size++;
        modCount++;
    }
}

remove方法

public class LinkedList<E> extends AbstractSequentialList<E> 
implements List<E>, Deque<E>, Cloneable,java.io.Serializable {
    
    public boolean remove(Object o) {
        if (o == null) {
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unlink(x);
                    return true;
                }
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }
    
     /**
     * 从链表中删除x结点的链接。
     */
    // eg1: x  null<--"a1"-->"a2"
    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;
    
        /** x.prev为null,表示x结点为第一个元素*/
        if (prev == null) {
            first = next; // 更新first头指针为x结点的后置结点
        } else {
            prev.next = next; // 将x的前置结点与x的后置结点相连接
            x.prev = null; // 断开x的前置指针
        }
    
        /** x.next为null,表示x结点为最后一个元素*/
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev; // 将x的后置结点与x的前置结点相连接
            x.next = null; // 断开x的后置指针
        }
    
        x.item = null;
        size--;
        modCount++;
        return element;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值