zoukankan      html  css  js  c++  java
  • LinkedList

    LinkedList是常用的集合结构之一,数据存储结构为链式存储,每个节点都有元素、前指针和后指针,指针指向了前节点和后节点的位置。同是LinkedList也是一个队列,实现了Deque接口,Deque接口继承了Queue接口。

    1.7以前为双向循环链表,之后没有循环了哦。

    队列出入顺序为FIFO,插入的位置是队列的尾部,而移出的位置是队头,Queue接口提供了offer()入列,和poll()出列的方法。

    LinkedList的add(E e)方法:
    public boolean add(E var1) {
            this.linkLast(var1);
            return true;
    }
    
    再来看this.linkLast(var1)方法:
    
    void linkLast(E var1) {
            LinkedList.Node var2 = this.last;    //内部初始提供了first和last两个节点
            LinkedList.Node var3 = new LinkedList.Node(var2, var1, (LinkedList.Node)null);     //构造一个新的Last节点,前指针指向原来的last节点var2 ,后指针为null
            this.last = var3;    //将var3 赋值给last节点
            if (var2 == null) {    //var2 为空 表示整个LinkedList没有任何元素,第一次加入,此时first节点和last节点都为var3
                this.first = var3;
            } else {    //不为空则将原last节点的后指针指向var3
                var2.next = var3;
            }
    
            ++this.size;
            ++this.modCount;
    }
    
    LinkedList的add(int var1, E e)方法
    public void add(int var1, E var2) {
            this.checkPositionIndex(var1);    //var1范围检查
            if (var1 == this.size) {    //如果var1==size 则直接再末尾添加一个节点
                this.linkLast(var2);
            } else {
                this.linkBefore(var2, this.node(var1));    //这里node方法找到var1下标对应的元素,在此元素前面插入新节点
            }
    
    }
    LinkedList.Node<E> node(int var1) {
            LinkedList.Node var2;
            int var3;
            if (var1 < this.size >> 1) {    //判断var1和中位值的大小,小于则从first节点开始向后遍历,大于则从last节点开始向前遍历
                var2 = this.first;
    
                for(var3 = 0; var3 < var1; ++var3) {
                    var2 = var2.next;
                }
    
                return var2;
            } else {
                var2 = this.last;
    
                for(var3 = this.size - 1; var3 > var1; --var3) {
                    var2 = var2.prev;
                }
    
                return var2;
            }
    }
    void linkBefore(E var1, LinkedList.Node<E> var2) {
            LinkedList.Node var3 = var2.prev;
            LinkedList.Node var4 = new LinkedList.Node(var3, var1, var2);
            var2.prev = var4;
            if (var3 == null) {    //若只有一个元素,则first节点为null
                this.first = var4;
            } else {
                var3.next = var4;
            }
    
            ++this.size;
            ++this.modCount;
    }
    

    再来看一下重写的offer和poll方法

    public boolean offer(E var1) {
            return this.add(var1);
    }
    插入的时候调用的是linkLast方法,及last节点为入列口,是队尾
    
    public E poll() {
            LinkedList.Node var1 = this.first;
            return var1 == null ? null : this.unlinkFirst(var1);
    }
    移除的时候调用了this.unlinkFirst(var1)方法
    private E unlinkFirst(LinkedList.Node<E> var1) {
            Object var2 = var1.item;    //获取first节点的数据返回
            LinkedList.Node var3 = var1.next;    //first节点的last节点
            var1.item = null;    //help GC
            var1.next = null;    //first节点的next节点指向null
            this.first = var3;    //现在first节点为var3
            if (var3 == null) {    //如果为null 则说明最开始first没有next元素,链表为空或者只有一个first元素,现在移除了first元素,链表里没有元素了,last为null
                this.last = null;
            } else {    //first节点的prev节点为null
                var3.prev = null;
            }
    
            --this.size;
            ++this.modCount;
            return var2;
        }
    
  • 相关阅读:
    项目中 2个或者多个EF模型 表名称相同会导致生成的实体类 覆盖的解决方法
    Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法;关于如何查看 EntityValidationErrors 详细信息的解决方法
    深夜杳杳
    我在学习
    IIS下新建虚拟目录
    Win10资源管理器异常
    Docker笔记三:Docker数据卷和DockerFile
    Docker笔记二:Docker拷贝,提交,进入容器和阿里云加速
    ElasticSearch7.x系列三:Logstash的使用
    ElasticSearch7.x系列二:Kibana的使用和C#的Nest客户端
  • 原文地址:https://www.cnblogs.com/sansamh/p/9064112.html
Copyright © 2011-2022 走看看