1. 程式人生 > >第30課 雙向鏈表的實現

第30課 雙向鏈表的實現

元素操作 sta 層次 是否 前驅 理論 temp 線性表 實驗

1. 單鏈表的另一個缺陷

(1)單向性只能從頭結點開始高效訪問鏈表中的數據元素

(2)缺陷:如果需要逆序訪問單鏈表中的數據元素,效率將極其低下(O(n2))

2. 雙向鏈表

(1)設計思路:在“單鏈表”的結點中增加一個prev指針,用於指向當前結點的前驅結點

技術分享

(2)繼承層次結構

技術分享

(3)DualLinkList的定義

template <typename T>
class DualLinkList : public List<T>
{
protected:
    struct Node : public Object{
        T value;
        Node
* next; Node* prev; }; mutable struct : public Object{ char reserved[sizeof(T)]; Node* next; Node* prev; }m_header; //... };

3. 雙向鏈表的主要操作

(1)插入元素操作

技術分享

(2)刪除元素操作

技術分享

【編程實驗】雙向鏈表的實現

//Iterator.h

//DualLinkList.h

//main.cpp

4. 開放性問題

(1)DualLinkList和LinkList中存在很多完全一樣的代碼

,如何進行重構降低代碼的冗余性?冗余代碼的出現是否意味著DualLinkList和LinkList之間應該是繼承關系

(2)自行實現雙向鏈表的兩個子類(DualStaticLinkList和 DualCircleList子類)

5. 小結

(1)雙向鏈表是為了彌補單鏈表的缺陷而重新設計的

(2)在概念上,雙向鏈表不是單鏈表,沒有繼承關系

(3)雙向鏈表中的遊標能夠直接訪問當前結點的前驅和後繼

(4)雙向鏈表是線性表概念的最終實現更貼近理論上的線性表

第30課 雙向鏈表的實現