雙鏈表
實現乙個雙鏈表,雙鏈表初始為空,支援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個插入的數並不是指當前鍊...