與單向鏈結串列相似,差別在於最後一個節點的指標指向頭節點(或第一個資料節點),形成環狀結構。
next 指向頭節點,而非 NULL。尾插入同理。node->next == head,而非 node->next == NULL。為解決單向串列「無法直接存取前驅節點」的痛點,每個節點增加左鏈指標指向前驅:
typedef struct node {
int data;
struct node *llink, *rlink; // 左鏈(前驅)、右鏈(後繼)
} JD;
結合上述兩者:雙向鏈結 + 首尾相連。兼具環狀遍歷與雙向存取優勢,是許多系統核心資料結構(如 Linux list_head)的基礎形式。
| 特性 | 單向鏈結 | 循環鏈結 | 雙向鏈結 | 雙向循環鏈結 |
|---|---|---|---|---|
| 節點指標數 | 1 | 1 | 2 | 2 |
| 尾節點指向 | NULL | 頭節點 | NULL | 頭節點 |
| 可逆向遍歷 | 否 | 否 | 是 | 是 |
| 環狀輪詢 | 否 | 是 | 否 | 是 |
| 插入/刪除複雜度 | O(1) 知前驅 | O(1) 知前驅 | O(1) 知節點 | O(1) 知節點 |
| 記憶體開銷 | 最小 | 最小 | +1 指標 | +1 指標 |