本篇主要介紹一種重要的鍊錶——「雙向鍊錶」(doubly linked lists)。
雙向鍊錶,顧名思義,它既可以從head開始正向遍歷鍊錶,也可以從tail開始反向遍歷鍊錶。雙向鍊錶的節點包含兩個指標,乙個指向下乙個節點(successor,同單鏈表),另乙個指向前乙個節點(predecessor),因此,也可以將它看作是兩個迭代方向不同的疊在一起的單鏈表。如下圖a。
以上是幾種雙向鍊錶的結構圖,包括空鍊錶的狀態。
其中,圖a是最簡單的一種雙向鍊錶,它包含兩個指標,head指向第乙個元素,tail指向最後乙個元素,完全可以看作是兩個走向不同的單鏈表的疊加。
圖b引入了sentinel節點(不是指標)。它是一種程式設計技巧,前面在介紹單鏈表的時候已經展示了sentinel節點的作用,無需特殊處理head。
圖c是乙個可雙向迴圈的迴圈鍊錶。
圖d是帶sentinel節點的迴圈鍊錶。
下面選取圖a的結構實現乙個雙向鍊錶。
#ifndef doubly_linked_list_h
#define doubly_linked_list_h
#include namespace foundationaldatastructure
; template class doublylinkedlist
t const & first() const;
t const & last() const;
void prepend(t const &);
void extract(t const &);
void purge();
void insertafter(nodeconst *, t const &);
void insertbefore(nodeconst *, t const &);
private:
node* head;
node* tail;
};//implementation/
template node::node(t const & _datum, node * _prev, node * _next)
: datum(_datum)
, prev(_prev)
, next(_next)
{}template t const & node::datum() const
template nodeconst * node::prev() const
template nodeconst * node::next() const
template doublylinkedlist::doublylinkedlist()
: head(null)
, tail(null)
{}template void doublylinkedlist::purge()
tail = null;
}template doublylinkedlist::~doublylinkedlist()
template nodeconst * doublylinkedlist::head() const
template nodeconst * doublylinkedlist::tail() const
template bool doublylinkedlist::isempty() const
template doublylinkedlist::operator bool() const
template t const & doublylinkedlist::first() const
template t const & doublylinkedlist::last() const
template void doublylinkedlist::prepend(t const & item)
template void doublylinkedlist::extract(t const & item) // pass by reference or value ?
else
delete temp;
temp = null;
continue; // break; for the first one
}ptr = ptr->next;}}
template doublylinkedlist::doublylinkedlist(doublylinkedlist const & linkedlist)
: head(null)
, tail(null)
template doublylinkedlist& doublylinkedlist::operator=(doublylinkedlist const & linkedlist)
return *this;
}template void doublylinkedlist::insertafter(nodeconst * arg, t const & item)
template void doublylinkedlist::insertbefore(nodeconst * arg, t const & item)
} // namespace foundationaldatastructure
#endif // doubly_linked_list_h
注:
1,本文的節點與鍊錶採用的是友元類的實現方式,也可以使用巢狀類的實現方式。
2,函式「operator bool() const; // operator bool() const 」的宣告和定義格式,以及類模版字首的新增方式。
資料結構基礎之陣列和鍊錶
陣列 陣列 array 是有限個相同型別的變數所組成的有序集合。陣列中每個變數被稱為元素。陣列是最簡單 最常用的資料結構。陣列的另乙個特點,在記憶體中順序儲存。陣列中每乙個元素,都儲存在小小的記憶體單元中,並且元素之間緊密排列,既不能打亂元素的儲存順序,也不能跳過某個儲存單元進行儲存。陣列操作 增 ...
資料結構 陣列與鍊錶
陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間,在使用前需要提前申請所佔記憶體的大小,不知道需要多大的空間,可能會浪費記憶體空間,即陣列空間利用率低 3.在陣列起始位置處,插入資料和刪除資料效率低。插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移 刪除資料時,待...
資料結構基礎 之 迴圈鍊錶
迴圈鍊錶是一種首尾相接的鍊錶。1 單迴圈鍊錶 在單鏈表中,將終端結點的指標域null改為指向表頭結點或開始結點即可。2 多重鏈的迴圈鍊錶 將表中結點鏈在多個環上。帶頭結點的單迴圈鍊錶 非空表 空表判斷空鍊錶的條件是head head next 僅設尾指標的單迴圈鍊錶 用尾指標rear表示的單迴圈鍊錶...