資料結構之雙向連結串列

Galois發表於2020-10-09

雙向連結串列

雙向連結串列(double linkedlist)是在單連結串列的每個結點中,再設定一個指向其前驅結點的指標域。所以在雙向連結串列中的結點都有兩個指標域,一個指向直接後繼,另一個指向直接前驅。

定義:

typedef struct DulNode
{
    ElemType data;
    struct DuLNode *prior; /*直接前驅指標*/
    struct DuLNode *next; /*直接後繼指標*/
} DulNode, *DuLinkList;

HakXSPmmYL.png!large

p->next->prior = p = p->prior->next

假設儲存元素 e 的結點為 s,要實現將結點 s 插入到結點 p 和 p-next 之間需要下面幾步:

ewoIW7iScJ.png!large

插入操作

/*把 p 賦值給 s 的前驅,如上圖中①*/
s->prior = p;
/*把 p->next 賦值給 s 的後繼,如上圖中②*/
s->next = p->next;
/*把 s 賦值給 p->next 的前驅,如上圖中③*/
p->next->prior = s;
/*把 s 賦值給 p 的後繼,如圖中④*/
p-next = s;

這個插入操作關鍵在於它們的順序,由於第 2 步和第 3 步都用到了 p->next。如果第 4 步先執行,則會使得 p->next 提前變成了 s,使得插入的工作完不成。

順序是先指定 s 的前驅和後繼,再指定後結點的前驅,最後解決前結點的後繼。

刪除操作

ODNJHcsmPx.png!large

/*把 p->next 賦值給 p->prior 的後繼,如圖中①*/
p->prior->next = p->next;
/*把 p->prior 賦值給 p->next 的前驅,如上圖中②*/
p->next->prior = p->prior;
/*釋放結點*/
free(p);

雙向連結串列相對於單連結串列來說,更復雜一些,畢竟它多了 prior 指標,對於插入和刪除時,需要格外注意順序。
由於雙向連結串列每個結點都需要記錄兩份指標,所以再空間上佔用略多一些。
不過由於雙向連結串列良好的對稱性,使得對某個結點的前後結點的操作,帶來了方便,可以有效提高演算法的時間效能。實際就是用空間來換時間。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章