資料結構之雙向鍊錶

2021-08-21 20:16:51 字數 2670 閱讀 3273

雙向鍊錶宛如一列火車,剛發明的時候只有乙個頭,如果它的行駛路線為:a->b->c->d->e->f->g->h->i->j->k->a

這個時候有一批貨物需要從k運到j,那麼它的運輸路線一定是:

k->a->b->c->d->e->f->g->h->i->j

所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!!!

雙向鍊錶:在單鏈表結點上增添了乙個指標域,指向當前結點的前驅。這樣就可以方便的由其後繼來找到其前驅,而實現輸出終端結點到開始結點的資料序列。

雙向鍊錶的結點結構

///

/// 雙向鍊錶節點

//////

public

class bdnode

public bdnodenext

public bdnodeprev

public

bdnode(t val, bdnodeprev, bdnodenext)

public

bdnode(t data, bdnodenext)

public

bdnode(bdnodenext)

public

bdnode(t data)

public

bdnode()

public t data

get

}public bdnodeprev

set

}public bdnodenext

set }}

雙向鍊錶還能作為雙向迴圈鍊錶使用,下圖為雙向迴圈鍊錶的結構圖:

雙向鍊錶的插入:

總共四個步驟:

步驟1:a.next=a2;

步驟2:a.prev=a1;

步驟3:a1.next=a;

步驟4:a2.prev=a;

插入順序按圖示所示,操作雖然簡單但是不能寫反,順序很重要!

其實現**如下:

///

/// 在最後附加元素

//////

public

void

n = head;

while (n.next != null)

n.next = d;

d.prev = n;

}//前插

public

void

insertbefore(t item, int i)

//在最開頭插入

if (i == 0)

bdnoden = head;

bdnoded = new bdnode();

int j = 0;

//找到位置i的前乙個元素d

while (n.next != null && j < i)

if (n.next == null) //說明是在最後節點插入(即追加)

else

}}///

/// 在位置i後插入元素item

//////

///public

void

insertafter(t item, int i)

if (i == 0)

bdnodep = head;

int j = 0;

while (p != null && j < i)

if (j == i)

p.next = q;

q.prev = p;

}else

}

刪除操作:只需把被刪除節點的前乙個節點的next指標指向它下乙個節點的下乙個節點,再把被刪除節點的下乙個節點的prev指標指向它前乙個節點的前乙個節點就ok了,如下圖所示:

其實現**如下:

///

/// 刪除位置i的元素

//////

///public t removeat(int i)

bdnodeq = new bdnode();

if (i == 0)

bdnodep = head;

int j = 0;

while (p.next != null && j < i)

if (j == i)

else

}

雙向鍊錶的好處在於:

1、對鍊錶資料的遍歷操作不僅僅能向後遍歷(如單鏈表),而且還能夠向前遍歷尋找元素,對鍊錶資料的操作更加靈活。

2、可以直接刪除某乙個資料元素,個人認為這是比較重要的一方面,因為對單鏈表而言,如果要刪除某乙個資料元素,需要遍歷至此元素之前的乙個結點才能刪除,而雙向鍊錶可以遍歷到某一元素,然後可以直接對它進行刪除操作。

資料結構之雙向鍊錶

簡述 指標域有乙個指標 而言,占用資源更大,但相應的 雙向鍊錶遍歷的時候只需要乙個指標就可以,而且 只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。實現 bothwaylinklist.h ifndef mymodule h define m...

資料結構之 雙向鍊錶

單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...

資料結構之雙向鍊錶

建立空鍊錶 list creat 摧毀鍊錶 in list 需要摧毀的鍊錶 void destroy list list 插入資料 頭插 in list 要插入的雙向鍊錶 in data 要插入的資料 bool insert head list list,data data 插入資料 尾插 in l...