第30課 雙向鏈表的實現
阿新 • • 發佈:2017-07-01
元素操作 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課 雙向鏈表的實現