首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 雙向循環鏈表完整實作與兩種設計對比

     編輯:Java 相關知識

雙向循環鏈表是經典資料結構,每個節點擁有前驅與後繼指針,首尾相連形成環。本文提供兩種完整實作風格並深度對比差異。

實作一:UUID 管理多鏈表長度(工業級風格)

特點:支援同時存在多條鏈表,靜態 Map<String, Integer> 記錄各鏈表長度,節點持有 linkedId 關聯。

核心結構

public class BothwayLoopLinked {
    private static final Map<String, Integer> sizeMap = new HashMap<>();
    private String linkedId = null;
    private Object data = null;
    private BothwayLoopLinked prev = this; // 初始自環
    private BothwayLoopLinked next = this;
    ...
}

關鍵操作

  • insertAfter/insertBefore:四指針重連,O(1) 插入
  • remove():斷開指針並自環,長度 -1,清除 linkedId
  • getSize():新建/已移除節點視為長度 1 的獨立鏈表

實作二:哨兵節點 + 泛型(教學/標準庫風格)

特點:頭節點為哨兵,不存儲數據;泛型 Node<E>;靜態 size 單鏈表計數。

核心結構

public class Node<E> {
    private E element;
    private Node<E> next;
    private Node<E> previous;
    private static int size = 0;
    ...
}

關鍵操作

  • addAfter/addBefore:頭/尾插入,處理空鏈表邊界
  • add(index, e):索引合法性檢查,index > size/2 反向遍歷優化
  • remove(index):同樣雙向遍歷優化
  • get(index):雙向遍歷,for 迴圈邏輯與實作一不同

兩大核心差異深度對比

維度實作一(UUID 多鏈表)實作二(哨兵單鏈表)
頭節點角色普通數據節點,自環初始化哨兵節點,不存數據
多鏈表支援原生支援(UUID 隔離)靜態 size 單例模式,不支援多實例
get(index) 遍歷從 head.next 開始(跳過哨兵邏輯)從 head 開始,首次不進迴圈直接返回
泛型支援Object,需轉型完整泛型 Node<E>
適用場景框架級、多鏈表共存、需節點身份識別教學演示、單鏈表、類型安全要求高

工程建議

  • 生產環境直接使用 java.util.LinkedList(雙向鏈表,非循環)或 ArrayDeque
  • 需循環特性時,可包裝 LinkedList 實現邏輯層循環
  • 自行實作時,務必處理併發安全(Collections.synchronizedList 或鎖)
  • 單元測試覆蓋:空表、單節點、頭尾插入、中間插入、越界、併發修改
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved