一開始確實被這個雙向鍊錶整暈了,node裡面不停套node,簡直無限套娃,讓人不知道該怎麼下手。後來看了資料結構與演算法分析這本書的**才算整明白。
我把鍊錶分成了三個部分:
第一部分是node.node是乙個由兩根指標,以及我們需要儲存的資料構成的結構體。這個node就是無限套娃的起源,也是鍊錶用於儲存資料的部分——node裡面的兩根指標的型別仍舊是node型別。
第二部分是迭代器,這個迭代器是用來訪問鍊錶的儲存資料,對其進行讀與寫。迭代器在這裡是乙個類,類裡面的資料成員僅僅只有一根node指標。這個node指標是用來訪問node這個結構體用的介面。迭代器的這一部分的函式都是對一些運算符號的過載,從而實現對順序查詢等等方法。
第三部分就是鍊錶構成自身功能的核心函式,他們的實現是依賴於node和迭代器這兩部分的。
鍊錶內在的成員是這樣構造的:
class list , prev, next{};
node( int&& d, node* p = nullptr, node* n = nullptr) :
data, prev, next{}
可以看到,一根指標指向前乙個節點,另一根指標指向後乙個節點。同時在鍊錶中的兩根頭尾node指標,其實是用來簡化問題的。他們自身是不儲存任何資料的。
而迭代器的實現如下:
class const_iterator {};
friend class list;
public:
const_iterator() :current {};
const_iterator(const const_iterator& rhs) :current {};
const int& operator*()const {};
friend class list;
public:
iterator() {};
int& operator*() };
iterator insert(iterator itr, const int&& x) };
至於刪除功能,**如下:
iterator erase(iterator itr) , prev, next{};
node( int&& d, node* p = nullptr, node* n = nullptr) :
data, prev, next{}
public:
class const_iterator {};
friend class list;
public:
const_iterator() :current {};
const_iterator(const const_iterator& rhs) :current {};
const int& operator*()const {};
friend class list;
public:
iterator() {};
int& operator*() ;
const_iterator begin()const ;
iterator end() ;
const_iterator end()const
return;
int size()const ,head,tail
rhs.thesize = 0;
rhs.head = nullptr;
rhs.tail = nullptr;
~list() };
iterator insert(iterator itr, const int&& x) };
iterator erase(iterator itr) {
node* p = itr.current;
iterator itral = p->next;
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
thesize--;
return itral;
iterator erase(iterator from, iterator to) {
for (iterator itr = from; itr != to; itr++)
itr = erase(itr);
return to;
void push_back(const int &x) {
insert(end(), x);
void push_back(const int&& x) {
insert(end(), std::move(x));
int& back() {
return *--end();
void push_front(const int&x) {
insert(begin(), x);
void push_front( int&& x) {
insert(begin(), std::move(x));
void pop_front() {
erase(begin());
void pop_back() {
erase(--end());
void clear() {
while (!empty())
pop_front();
單向鍊錶和雙向鍊錶
1.單向鍊錶 單向鍊錶只可向乙個方向遍歷。查詢乙個節點的時候需要從第乙個節點開始每次訪問下乙個節點,一直訪問到需要的位置。也可以提前把乙個節點的位置另外儲存起來,然後直接訪問。2.雙向鍊錶 可以從任何乙個節點訪問前乙個節點,也可以訪問後乙個節點,以至整個鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中...
單向鍊錶和雙向鍊錶
一 鍊錶是什麼?單向鍊錶linked list 是一種在物理上非連續 非順序的資料結構,由若干節點 node 所組成。而節點包括兩部分,一部分是存放資料的變數data,另一部分是指向下乙個節點的指標next。鍊錶的第1個節點被稱為頭節點,最後1個節點被稱為尾節點,尾節點的next指標指向空。注意 鍊...
鍊錶(單向鍊錶,雙向鍊錶)
首先鍊錶是以節點的方式儲存資料的,每個節點包含資料域 data 節點域 next 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...