採用虛擬頭尾節點的雙向鍊錶結構設計鍊錶

2021-10-20 07:32:08 字數 2394 閱讀 9019

設計鍊錶的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val 和next。val 是當前節點的值,next 是指向下乙個節點的指標/引用。如果要使用雙向鍊錶,則還需要乙個屬性 prev 以指示鍊錶中的上乙個節點。假設鍊錶中的所有節點都是 0-index 的。

在鍊錶類中實現這些功能:

1.get(index):獲取鍊錶中第 index 個節點的值。如果索引無效,則返回-1。

2.addathead(val):在鍊錶的第乙個元素之前新增乙個值為 val 的節點。插入後,新節點將成為鍊錶的第乙個節點。

3.addattail(val):將值為 val 的節點追加到鍊錶的最後乙個元素。

4.addatindex(index,val):在鍊錶中的第 index 個節點之前新增值為 val 的節點。如果 index 等於鍊錶的長度,則該節點將附加到鍊錶的末尾。如果 index大於鍊錶長度,則不會插入節點。如果index小於0,則在頭部插入節點。

5.deleteatindex(index):如果索引 index 有效,則刪除鍊錶中的第 index 個節點。

示例:mylinkedlist linkedlist = new mylinkedlist();

linkedlist.addathead(1);

linkedlist.addattail(3);

linkedlist.addatindex(1,2); //鍊錶變為1-> 2-> 3

linkedlist.get(1); //返回2

linkedlist.deleteatindex(1); //現在鍊錶是1-> 3

linkedlist.get(1); //返回3

思路:採用虛擬頭尾部節點,雙向鍊錶設計,初始化mylinkedlist時,new乙個虛擬的頭節點和尾節點,將首尾部位連線成雙向鍊錶的形式,

1.get(index) 從頭節點開始遍歷,直到index時,如果節點指向了尾節點,則說明index越界返回-1,否則返回當前節點的val;

2.addathead(val):直接通過建構函式listnodes(val,phead,phead->next),生存待新增的節點pnewnode,然後將虛擬頭節點的next指向pnewnode,原來的頭節點的prev指向pnewnode;

3.addattail():直接通過建構函式listnodes(val,ptail->prev,ptail),生存待新增的節點pnewnode,然後將虛擬的尾節點的prev指向pnewnode,原來的尾節點的next指向pnewnode;

4.addatindex(index,val):從頭節點開始遍歷,直到index位置,如果存在index位置pnode,則直接通過建構函式listnodes(val,pnode,pnode->prev),生存待新增的節點pnewnode,如果插入節點在鍊錶尾部,則直接通過建構函式listnodes(val,ptail,ptail->prev),生存待新增的節點pnewnode,然後將pnewnode的next和prev節點分別與pnewnode建立連線;

5.deleteatindex(index):從頭節點開始遍歷,直到index位置pnode,若index存在,則將pnode的next和prev節點之間建立連線,刪除pnode;

struct listnodes

listnodes

(int _val)

:val

(_val)

,next

(nullptr),

prev

(nullptr

)listnodes

(int _val,listnodes* _next,listnodes* _prev)

:val

(_val)

,next

(_next)

,prev

(_prev)

//通過值和前後節點建立新的節點};

class

mylinkedlist

intget

(int index)

if(index ==-1

)return pnode-

>val;

return-1

;}void

addathead

(int val)

void

addattail

(int val)

void

addatindex

(int index,

int val)

if(index ==-1

)else

if(index ==

0&& pnode-

>next == ptail)

}void

deleteatindex

(int index)

if(index ==-1

)}};

雙向鍊錶容器list的頭尾中,全部刪除

include include using namespace std int main list iterator it for it l.begin it l.end it cout l.remove 4 for it l.begin it l.end it cout l.pop front f...

雙向鍊錶結構實現

雙向鍊錶 雙向鍊錶是可以正向遍歷鍊錶節點和反向遍歷鍊錶節點的一種鍊錶資料結構。在單向鍊錶中,每個節點只有乙個指向下乙個節點的引用,在雙向鍊錶中節點新增乙個指向前乙個節點的引用,新增相應的反向遍歷方法,即可實現訪問前乙個節點的。新增和刪除節點時需要解決四個指向 引用 操作,相對來說更複雜,但是解決好在...

線性結構 雙向鍊錶

雙向鍊錶 1.單向鍊錶的特點 1.只能從頭遍歷到尾,或者從尾遍歷到頭 一般是從頭到尾 即鍊錶數單向的 2.單向鍊錶存在的問題 2.而實際中,我們需要從某個節點嗲它的上乙個節點。如文字編輯中,通過前後箭頭可以使得游標前後移動 3.雙向鍊錶的特點 1.既可以從頭遍歷到尾,也可以從尾遍歷到頭 4.雙向鍊錶...