將單鏈表尾節點 next 指向頭節點,形成環。
優勢:從尾節點可 O(1) 到達頭節點,適合頻繁頭尾操作。
合併兩表 O(1) 技巧:
q = r1->next; // 保存 L1 頭節點 r1->next = r2->next->next; // L1 尾接 L2 首數據節點 free(r2->next); // 釋放 L2 頭節點 r2->next = q; // L2 尾接 L1 頭,成環
節點增設 prior 指向前驅,next 指向後繼。
typedef struct DuNode {
DataType data;
struct DuNode *prior, *next;
} DuNode, *DuLinkList;
插入 *s 於 *q 之前(順序關鍵):
s->prior = q->prior; // (1) q->prior = s; // (2) (1)(2)順序不可換,否則丟失 q 原前驅 q->prior->next = s; s->next = q;刪除 *q(順序可互換):
q->next->prior = q->prior; // (1) q->prior->next = q->next; // (2) free(q);
以陣列模擬鏈表,指標改為陣列下標 (靜態指標),空指標用 -1 表示。
#define MAXSIZE 1000
typedef struct {
DataType data;
int next; // 下一節點下標
} SNode;
SNode S[MAXSIZE];
int SL, SX; // SL: 用戶鏈表頭, SX: 空閒鏈表頭
申請節點(從空閒鏈表取):
if (SX != -1) {
t = SX;
SX = S[SX].next;
}
回收節點(歸還空閒鏈表):
S[t].next = SX; SX = t;
| 特性 | 單循環鏈表 | 雙向鏈表 | 靜態鏈表 |
|---|---|---|---|
| 空間分配 | 動態 malloc | 動態 malloc | 靜態陣列 |
| 遍歷方向 | 單向 | 雙向 | 單向 |
| 插入/刪除 | 需前驅查找 | O(1) 給定節點 | O(1) 給定下標 |
| 適用場景 | 循環輪詢、佇列 | 雙向瀏覽、LRU 快取 | 無 malloc 環境、嵌入式 |
單循環鏈表優化頭尾連接,雙向鏈表以空間換雙向 O(1) 操作,靜態鏈表以陣列下標替代指標適配受限環境。掌握三者節點定義、指標/下標維護邏輯與典型操作,是資料結構工程落地的核心基本功。