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++; //修改次數自增;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM