zoukankan      html  css  js  c++  java
  • java集合 LinkedList 添加元素 add() 的底层

    双向链表支撑的数据结构,

    对于链表,每一个链子的节称为节点,节点包括3个元素,数据(数据域),头部指针,指向下一个元素,尾部指针(引用域)指向上一个元素;

    开头的元素和结尾的元素?

    如果不能指向另一个元素则指针指空;*

    第一次添加元素:size=0,所添加的元素的顺序是自然合法的;

    public LinkedList() { } 创建一个空的linklist{}

    执行linkedlast: public boolean add(E e) { linkLast(e);

    void linkLast(E e) {
    final Node l = last; 当前节点的最后一个节点
    final Node newNode = new Node<>(l, e, null); 定义新节点
    last = newNode;
    if (l == null) 如果当前节点的最后一个节点的元素是空的*
    first = newNode; 将新节点添加为第一个节点
    else
    l.next = newNode; 将新节点添加为最后一个节点的下一个节点
    size++; 容量++
    modCount++;
    }

    transient 瞬态的 暂时的,被transient修饰后不可被序列化

    判断为空,index>size:size =n,所添加元素顺序是n+1,判断合法*

    遍历到目标下标的一个元素(尚未添加),此间的链表视为当前链表,

    preNode.Next = newNode;
           newNode.SetNode(preNode, _linkHead);  
           _linkHead.Prev = newNode;
    
    

    添加到指定下标:

    public void add(int index, E element) {
    checkPositionIndex(index);

    if (index == size)
       linkLast(element);
    else
       linkBefore(element, node(index));      //node方法找出该下标传入执行before
    }
    

    先检查下标是否合法;再执行linklast/linkbefore;

    void linkBefore(E e, Node succ) {
    // assert succ != null;

    在非空节点succ前加入e元素(目标元素)

    //指定前驱节点

    final Node pred = succ.prev;

    //新的节点,前驱为succ的前驱,其后继是succ
    *final Node newNode = new Node<>(pred, e, succ); *

    //构建双向链表,succ的前驱是新节点

    ​ succ.prev = newNode;


    这三行:pred在succ前,newnode在succ前,succ前指new使插入到中间,前中后;

    if (pred == null) 如果新节点的前一个节点是空
    first = newNode; 新节点作为第一个节点;
    else
    pred.next = newNode; // 前节点的后指针指向新节点
    size++; // 容量自增
    modCount++; //修改次数自增;
    }

  • 相关阅读:
    马氏距离的深入理解
    Mahalanobis Distance(马氏距离)
    Weka EM 协方差
    数据挖掘、概率分析与决策支持
    二、 Android中gravity与layout_gravity的区别
    一、 Android完全退出应用程序
    python configparse
    时间戳与时间互转
    python argparse
    时间插件
  • 原文地址:https://www.cnblogs.com/msslearning/p/14866455.html
Copyright © 2011-2022 走看看