雙向循環鏈表將頭尾相連,每個節點同時擁有 prior(前驅)與 next(後繼)指標,支援雙向遍歷,解決了單鏈表無法回溯的缺陷。

typedef int ElemType;
typedef struct DulNode {
ElemType data;
struct DulNode *prior, *next;
} DulNode, *DuLinkList;
Status ListInsert(DuLinkList &L, int i, ElemType e) {
DuLinkList p = GetElemP(L, i); // 定位第 i 個節點
if (!p) return ERROR;
DuLinkList s = (DuLinkList)malloc(sizeof(DulNode));
s->data = e;
s->prior = p->prior;
s->next = p;
p->prior->next = s;
p->prior = s;
return OK;
}
Status ListDelete(DuLinkList &L, int i, ElemType &e) {
DuLinkList p = GetElemP(L, i);
if (!p) return ERROR;
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}

雙向循環鏈表常用於LRU 快取淘汰鏈表、記憶體管理空閒塊鏈表、音樂播放列表等需要頻繁雙向遍歷與 O(1) 刪除的場景。