實現乙個雙鏈表,初始為空,支援5
55種操作:
(1) 在最左側插入乙個數;
(2) 在最右側插入乙個數;
(3) 將第k
kk個插入的數刪除;
(4) 在第k
kk個插入的數左側插入乙個數;
(5) 在第k
kk個插入的數右側插入乙個數。
現在要對該鍊錶進行m
mm次操作,進行完所有操作後,從左到右輸出整個鍊錶。
輸入格式:
第一行包含整數m
mm,表示操作次數。接下來m
mm行,每行包含乙個操作命令,操作命令可能為以下幾種:
(1) 「l x」,表示在鍊錶的最左端插入數xxx。
(2) 「r x」,表示在鍊錶的最右端插入數xxx。
(3) 「d k」,表示將第k
kk個插入的數刪除。
(4) 「il k x」,表示在第k
kk個插入的數左側插入乙個數。
(5) 「ir k x」,表示在第k
kk個插入的數右側插入乙個數。
輸出格式:
共一行,將整個鍊錶從左到右輸出。
資料範圍:
1 ≤m
≤100000
1\le m\le 100000
1≤m≤10
0000
可以用陣列模擬雙鏈表。開三個陣列,e[i
]e[i]
e[i]
表示下標i
ii的節點的值,l[i
]l[i]
l[i]
表示下標i
ii的節點的左邊的節點的下標,r[i
]r[i]
r[i]
表示下標i
ii的節點的右邊的節點的下標,然後idx
idxid
x表示如果當前執行插入,它所處的下標。可以先假定鍊錶中已經有了兩個節點,分別是下標0
00和1
11,那麼初始化的時候就是r[0
]=1,
l[1]
=0,i
dx=2
r[0]=1,l[1]=0,idx=2
r[0]=1
,l[1
]=0,
idx=
2。關於操作,我們只需要實5
55和3
33就可以了。操作1
11相當於在0
00的右邊插入乙個數,操作2
22相當於在l[1
]l[1]
l[1]
的右邊插入乙個數,操作4
44相當於l[k
]l[k]
l[k]
的右邊插入乙個數(第k
kk個插入的數的下標是k+1
k+1k+
1,在它的左邊插入相當於是在l[k
+1
]l[k+1]
l[k+1]
的右邊插入)。而操作5
55和3
33
#include
using
namespace std;
const
int n =
100010
;int e[n]
, l[n]
, r[n]
, idx;
void
init()
// 在下標是k的點的右邊插入x
void
add(
int k,
int x)
void
remove
(int k)
intmain()
else
if(op ==
"r")
else
if(op ==
"d")
else
if(op ==
"il"
)else
if(op ==
"ir")}
int head = r[0]
;while
(head !=1)
return0;
}
所有操作時間複雜度o(1
)o(1)
o(1)
,空間取決於插入了多少次。
AcWing 827 雙鏈表
實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k個插入的數右側插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。題 目 include define n...
AcWing 827 雙鏈表(C 演算法)
1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k個插入的數右側插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,...
Acwing 827 雙鏈表 陣列實現添,刪
實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k個插入的數右側插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊...