陣列模擬雙鏈表

2021-10-06 16:42:46 字數 1589 閱讀 1340

雙鏈表

實現乙個雙鏈表,雙鏈表初始為空,支援5種操作:

(1) 在最左側插入乙個數;

(2) 在最右側插入乙個數;

(3) 將第k個插入的數刪除;

(4) 在第k個插入的數左側插入乙個數;

(5) 在第k個插入的數右側插入乙個數

雙鏈表,需要開三個陣列。

e存放該節點的數值,

l 陣列存放該節點左邊的節點,

r陣列存放該節點右邊的節點。

初始化:使用哨兵節點0和1,下標為0的節點記為頭結點head,下標為1的節點記為尾節點tail。

void init()
在下標為k的節點右邊插入節點數值為x,該節點的下標為idx,首先需要e[idx]=x;然後分為四步,

step1:看該節點的右節點

step2:看該節點的左節點

step3:看原來的右節點的左節點

step4:看k的右節點

需要注意的是:step3和step4不能交換順序,這是因為r[k]存在被提前更新的風險。

在k節點左邊插入乙個節點,數值為x,相當於求l[k

]l[k]

l[k]

的右節點,只需要呼叫上述的add函式,將k改為k左邊的節點l[k

]l[k]

l[k]

。刪除下標為k的節點,只需要使得k的左節點 l[k

]l[k]

l[k]

的右節點為r[k

]r[k]

r[k]

,相反,k的右節點r[k

]r[k]

r[k]

的左節點變為l[k

本題需要注意:

因為0和1號節點已經占用,所用第k個節點對應的是下標為k+1的節點。比如第1個節點,對應的下標是2.

ac**

#includeusing namespace std;

const int maxn=1e5+10;

int l[maxn],r[maxn],e[maxn],idx;

//初始化

void init()

//在下標為k的節點的右邊,插入乙個點

int add(int k,int x)

//刪除第k個點

void remove(int k)

int main()

else if(op=="l")

else if(op=="d")

else if(op=="il")

else if(op=="ir")

}for(int i=r[0];i!=1;i=r[i]) cout<

return 0;

}

陣列實現雙鏈表

之前寫了陣列實現單鏈表,提到了陣列實現鍊錶比指標實現最大的優點就是快,可以隨機訪問,而且不用new節點。在圖論的題目裡用到鄰接表,往往都是用陣列實現。陣列實現雙鏈錶比單鏈表就多了一些對於左指標的操作。為了實現的方便,不像在單鏈表實現裡用乙個額外的變數head去記錄鍊錶的頭節點。而是直接用兩個哨兵節點...

一維陣列模擬單鏈表 鄰接表和雙鏈表 模板

單鏈表 模板題 acwing 826.單鏈表 實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數...

資料結構 資料模擬雙鏈表

實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k個插入的數右側插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊...