我的LinkedList源码理解

LinkedList源码理解

  • LinkedList是双向链表结构

       //    节点
       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;
            }
        }
        
        //    首节点
        transient Node<E> first;
        //    尾节点
        transient Node<E> last;
    
  • 获取节点

        //    获取首节点
        public E getFirst() {
            final Node<E> f = first;
            if (f == null)
                throw new NoSuchElementException();
            return f.item;
        }
        
        //    获取尾节点
         public E getLast() {
            final Node<E> l = last;
            if (l == null)
                throw new NoSuchElementException();
            return l.item;
        }
        
        //    获取指定下标的节点
        public E get(int index) {
            checkElementIndex(index);
            return node(index).item;
        }
    
  • 修改节点

        public E set(int index, E element) {
            checkElementIndex(index);
            Node<E> x = node(index);
            E oldVal = x.item;
            x.item = element;
            return oldVal;
        }
    
  • 添加节点

         /**
         * Links e as first element. 添加链表第一个节点
         */
        private void linkFirst(E e) {
        	//    将第一个节点赋值给 f
            final Node<E> f = first;
            //    创建一个节点                   开头 数据 结尾
            final Node<E> newNode = new Node<>(null, e, f);
            //    把节点赋值给 first
            first = newNode;
            //    如果 f  节点等于空
            if (f == null)
            	//    将节点赋值给最后
                last = newNode;
            else
            	//    将新建的节点等于fist节点的开头(连接)
                f.prev = newNode;
            size++;
            modCount++;
        }
    
        /**
         * Links e as last element. 添加链表最后一个元素
         */
        void linkLast(E e) {
        	//    将最后的节点 赋值给 l
            final Node<E> l = last;
            //    创建新的节点                  开头 数据 结尾
            final Node<E> newNode = new Node<>(l, e, null);
            //    将新节点赋值给 last
            last = newNode;
            //    如果 l 节点等于空
            if (l == null)
            	//    新节点 赋值给 first
                first = newNode;
            else
            	//    新节点的等于最后节点的结尾(连接)
                l.next = newNode;
            size++;
            modCount++;
        }
    
        //    连接到指定节点之前
        void linkBefore(E e, Node<E> succ) {
            // assert succ != null;
        	//    获取参数节点的上一个节点引用
            final Node<E> pred = succ.prev;
            //    创建新节点,
            final Node<E> newNode = new Node<>(pred, e, succ);
    		//    将下个节点的首节点指向当前节点
            succ.prev = newNode;
            if (pred == null)
                first = newNode;
            else
                pred.next = newNode;
            size++;
            modCount++;
        }
    
  • 删除节点

        /** 删除节点(第一个)
         * Unlinks non-null first node f.
         */
        private E unlinkFirst(Node<E> f) {
            // assert f == first && f != null;
        	//    获取节点的数据
            final E element = f.item;
            //    获取节点的下一个数据
            final Node<E> next = f.next;
            //    将节点清除
            f.item = null;
            f.next = null; // help GC
            //    将节点下一个数据设置为第一个节点
            first = next;
            //    判断节点是否有下一个节点
            if (next == null)
                last = null;
            else
                next.prev = null;
            //    大小减去移除的节点
            size--;
            modCount++;
            return element;
        }
    
        /**删除节点(最后一个节点)
         * Unlinks non-null last node l.
         */
        private E unlinkLast(Node<E> l) {
            // assert l == last && l != null;
        	//    获取节点的数据
            final E element = l.item;
            //    获取节点上一个的数据
            final Node<E> prev = l.prev;
            //    删除节点
            l.item = null;
            l.prev = null; // help GC
            last = prev;
            //    判断节点是否有上一个节点
            if (prev == null)
                first = null;
            else
                prev.next = null;
            
            size--;
            modCount++;
            return element;
        }
    
        /**删除节点
         * Unlinks non-null node 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;
                x.prev = null;
            }
            //    判断是否是最后一个节点
            if (next == null) {
                last = prev;
            } else {
                next.prev = prev;
                x.next = null;
            }
    
            x.item = null;
            size--;
            modCount++;
            return element;
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值