ACWing 827 雙鏈表

2021-10-19 09:52:03 字數 2087 閱讀 6941

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