• LinkedList 源码分析


    LinkedList :双向链表结构, 
    内部存在frist节点 和 last节点。通过改变 首节点和 尾节点的引用来实现新增和修改
    
    
    
    有一个内部类:
    	//节点类,内部包括前节点和后节点,和数据项
    	// 构造的时候把前和后节点,数据项初始化
        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;
            }
        }
    	
    	//大小默认是0
    	transient int size = 0;
    
        /**
         * Pointer to first node. 头节点
         * Invariant: (first == null && last == null) ||
         *            (first.prev == null && first.item != null)
         */
        transient Node<E> first;
    
        /**
         * Pointer to last node. 尾节点
         * Invariant: (first == null && last == null) ||
         *            (last.next == null && last.item != null)
         */
        transient Node<E> last;
    
        /**
         * Constructs an empty list.
         */
        public LinkedList() {
        }
    
    	
    	 /**
         * Constructs an empty list.构造方法默认空
         */
        public LinkedList() {
        }
    	
    	    public boolean add(E e) {
            linkLast(e);
            return true;
        }
    	
    	// 新建一个node,前节点指向last节点,后节点为null。将新建node为尾节点last
        public boolean add(E e) {
            linkLast(e); // 
            return true;
        }
    	
    	//追加一个节点为尾节点
        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
                l.next = newNode;
            size++;
            modCount++;
        }
    	
    		// 删除一个元素, 从头节点遍历每一个节点,直到找到并删除
    	    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;
        }
    	
    	//按索引插入,根据索引大小 /2 确定向前遍历,还是向后遍历,得到要插入的node,将该node的前后节点和新节点改变
    	public void add(int index, E element) {
            checkPositionIndex(index);
    
            if (index == size)
                linkLast(element);
            else
                linkBefore(element, node(index));
        }	
    		
    		
    		
    	    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++;
        }
    	
    	
    	
    	
    	
    	
    

     图如下:

     

  • 相关阅读:
    JVM体系结构和工作方式
    ClassLoader工作机制
    Javac编译原理
    类与类之间的几种关系
    一周总结汇总_2016-09-04
    一周规划汇总_2016-09-04
    Java基础知识笔记(一:修饰词、向量、哈希表)
    控制反转IoC简介
    DBCP连接池简介
    Struts与Struts2的区别
  • 原文地址:https://www.cnblogs.com/GotoJava/p/7412605.html
Copyright © 2020-2023  润新知