1. 程式人生 > >【Java集合】LinkedList詳解中篇

【Java集合】LinkedList詳解中篇

rst 需要 源碼 -o linked 興趣 app equal 頭節點

這是關於LinkedList的第二篇文章,我將會源碼分析LinkedList的部分重要代碼,關鍵地方我都有註釋說明,希望大家能比較明白的看懂!

分析源碼按照順序分析:

  • 變量
  • 構造方法
  • 方法

一、變量

技術分享圖片

註意:如果一個鏈表沒有節點,那麽first和last都為null

二、構造方法

技術分享圖片

三、方法

1、linkFirst(E e)

方法描述:將e這個節點加入鏈表頭

技術分享圖片

註意:

  • 頭節點的pre指針指向的是null,並沒有指向尾節點,所以並不是循環雙向鏈表。
  • 如果當前鏈表只有一個節點,那麽first和last指針均指向該節點

2、linkLast(E e)

方法描述:將e這個節點加入鏈表尾

技術分享圖片

註意:

  • 尾節點的next指針指向的是null,並沒有指向頭節點,所以並不是循環雙向鏈表。
  • 如果當前鏈表只有一個節點,那麽first和last指針均指向該節點

3、linkBefore(E e, Node succ)

方法描述:將e這個節點加入到不為空的succ節點之前

技術分享圖片

註意:

  • 該方法是往【succ節點】前加節點,所以需要判斷該節點是否是頭節點,原因是需要更改first這個指針指向的節點

步驟:

  • 構造新的節點,它的prev指向【succ節點】的前一個節點,它的next指向【succ節點】
  • 【succ節點】的prev指向新的節點
  • 【succ節點】的前一個節點的next指向新節點

4、unlinkFirst(Node f)

方法描述:去掉不為空的頭節點

技術分享圖片

註意:

  • 如果【f節點】不是頭結點,那麽【f節點】之前【包括f節點】都將從鏈表中斷開丟掉,只是size的減一存在問題

步驟:

  • first指針指向【下一個節點】
  • 【f節點】的next不再指向【下一個節點】

5、unlinkLast(Node l)

方法描述:去掉不為空的尾節點

技術分享圖片

註意:

  • 如果【l節點】不是尾結點,那麽【尾節點】之後【包括l節點】都將從鏈表中斷開丟掉,只是size的減一存在問題

步驟:

  • last指針指向【上一個節點】
  • 【上一個節點】的next指向null

6、unlink(Node x)

方法描述:去掉不為空的【x節點】

技術分享圖片

步驟:

  • 【上一個節點】的next指針指向【下一個節點】,【x節點】prev指向null
  • 【下一個節點】的prev指針指向【上一個節點】,【x節點】next指向null

7、簡單方法的概括

技術分享圖片

技術分享圖片

8、add(E e)

方法描述:向鏈表插入1個元素

技術分享圖片

註意:

  • add方法默認是加元素加入【尾節點】

9、remove(Object o)

方法描述:移除鏈表中某個節點

技術分享圖片

註意:

  • 這裏判斷了【被移除元素】是否為null的情況,為空則==即可,如果不為null,則需要equals來判斷是否相等
  • == 和 equals的區別小夥伴們有興趣可以查一查

10、addAll

方法描述:添加新的節點到鏈表中

技術分享圖片

11、clear()

方法描述:清除鏈表

技術分享圖片

【Java集合】LinkedList詳解中篇