雙向鍊錶基礎

2022-05-05 13:21:12 字數 1106 閱讀 9070

雙向鍊錶只是在原來的單鏈表中加入了乙個前驅指標,因此,在雙鏈表中執行按值查詢和循秩查詢與單鏈表是相同的。但在插入和刪除操作中和單鏈表有著較大的不同。此外雙鏈表還能很方便的找到其前驅結點,因此,除了找到插入結點外,插入和刪除結點的時間複雜度僅為\(o(1)\)。

typedef struct dnode dnode, *dlinklist;
//尾插法

void initlist(dlinklist &l, int n)

}

在雙向鍊錶中第i個位置插入節點s的演算法:

//在第i個位置之後插入新的元素

bool insertdnode(dlinklist &l, int i, int e)

if(!p || j > i) return false;

s = (dnode*)malloc(sizeof(dnode));

s->data = e;

s->pred = p; //第一步

s->succ = p->succ; //第二步

p->succ->pred = s; //第三步

p->succ = s; //第四步

}

上述的語句順序不是唯一的,但也不是任意的,一二步必須在第四步之前,否則*p的後繼結點的指標就丟掉了,導致插入失敗。

刪除雙向鍊錶中第i個位置的後繼節點q的演算法:只需要越過結點i處理i的前驅結點和後繼節點即可。

bool deletednode(dlinklist &l, int i, int &e)

if(!p || j > i + 1) return false;

p->pred->succ = p->succ;

p->succ->pred = p->pred;

free(p);

return true;

}

雙向鍊錶相對於單鏈表來說,要更複雜一些,因為它多了前驅指標,所以在插入和刪除操作時要格外小心,另外,由於它每個結點都要記錄兩份指標,所以略佔空間,不過,由於它良好的對稱性,使得對某個結點的前後結點的操作帶來了方便,可以有效提高演算法的時間效能,說白了就是用空間置換時間。

mysql 雙向鍊錶 雙向鍊錶

雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...

雙向鍊錶(鍊錶)

雙向鍊錶 每個節點包含指向後繼節點的指標和指向前驅節點的指標。繼承關係圖 實體圖 duallinklist.h duallinklist 雙向鍊錶類模板 成員變數 node 節點實體 m header 頭節點 m length 鍊錶長度 m step 步進長度 m current 當前節點前乙個節點...

雙向鍊錶 3 反轉雙向鍊錶

雙向鍊錶的反轉過程,可以參考下面的例圖。a 原始雙向鍊錶 b 反轉後的雙向鍊錶 下面是乙個用於反轉雙向鍊錶的簡單方法。所需要做的事情就是交換每個節點的前向指標和後向指標,然後調整鍊錶的頭指標和尾指標。include struct node 對鍊錶進行反轉 void reverse node head...