雙向連結串列
雙向連結串列(double linkedlist)是在單連結串列的每個結點中,再設定一個指向其前驅結點的指標域。所以在雙向連結串列中的結點都有兩個指標域,一個指向直接後繼,另一個指向直接前驅。
定義:
typedef struct DulNode
{
ElemType data;
struct DuLNode *prior; /*直接前驅指標*/
struct DuLNode *next; /*直接後繼指標*/
} DulNode, *DuLinkList;
p->next->prior = p = p->prior->next
假設儲存元素 e 的結點為 s,要實現將結點 s 插入到結點 p 和 p-next 之間需要下面幾步:
插入操作
/*把 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 的前驅和後繼,再指定後結點的前驅,最後解決前結點的後繼。
刪除操作
/*把 p->next 賦值給 p->prior 的後繼,如圖中①*/
p->prior->next = p->next;
/*把 p->prior 賦值給 p->next 的前驅,如上圖中②*/
p->next->prior = p->prior;
/*釋放結點*/
free(p);
雙向連結串列相對於單連結串列來說,更復雜一些,畢竟它多了 prior 指標,對於插入和刪除時,需要格外注意順序。
由於雙向連結串列每個結點都需要記錄兩份指標,所以再空間上佔用略多一些。
不過由於雙向連結串列良好的對稱性,使得對某個結點的前後結點的操作,帶來了方便,可以有效提高演算法的時間效能。實際就是用空間來換時間。
本作品採用《CC 協議》,轉載必須註明作者和本文連結