單向鍊錶和雙向鍊錶區別 雙向鍊錶

2021-10-11 23:38:02 字數 2620 閱讀 2781

一開始確實被這個雙向鍊錶整暈了,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 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...