用陣列模擬鍊錶

2021-10-03 09:28:15 字數 3398 閱讀 8824

用陣列模擬單鏈表

資料結構課本上的單鏈表演算法,在建立每個結點時都需要new乙個空間,new函式耗時長,當結點數較多時,每個結點都需要new,這樣的演算法在題中容易超時。

利用陣列模擬單鏈表可以防止超時問題

826. 單鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作:

(1) 向煉表頭插入乙個數;

(2) 刪除第k個插入的數後面的數;

(3) 在第k個插入的數後插入乙個數

現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。

注意:題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令可能為以下幾種:

(1) 「h x」,表示向煉表頭插入乙個數x。

(2) 「d k」,表示刪除第k個輸入的數後面的數(當k為0時,表示刪除頭結點)。

(3) 「i k x」,表示在第k個輸入的數後面插入乙個數x(此操作中k均大於0)。

輸出格式

共一行,將整個鍊錶從頭到尾輸出。

資料範圍

1≤m≤100000

所有操作保證合法。

輸入樣例:

10h 9

i 1 1

d 1d 0

h 6i 3 6

i 4 5

i 4 5

i 3 4

d 6輸出樣例:

6 4 6 5

idx用來記錄當前用到哪個點了,從0開始記錄。第k個數的下標為k-1。

#include

using

namespace std;

const

int n=

1e5+10;

// head 為頭結點的下標

// e[i] 為結點i的data域

// ne[i] 為結點i的next域(i結點的下乙個結點的下標)

// idx 儲存當前已經用到哪個點了

int head,e[n]

,ne[n]

,idx;

// 初始化

void

init()

// 將x插到頭結點

void

add_to_head

(int x)

// 將x插到下標是k的點的後面

void

add(

int k,

int x)

// 將下標是k的點後面的乙個點刪除

void

remove

(int k)

intmain()

else

if(op==

'd')

else

}for

(int i=head;i!=-1

;i=ne[i]

) cout<<<

" ";

return0;

}

用陣列模擬雙鏈表

827. 雙鏈表

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

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

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

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

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

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

現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。

注意:題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令可能為以下幾種:

(1) 「l x」,表示在鍊錶的最左端插入數x。

(2) 「r x」,表示在鍊錶的最右端插入數x。

(3) 「d k」,表示將第k個插入的數刪除。

(4) 「il k x」,表示在第k個插入的數左側插入乙個數。

(5) 「ir k x」,表示在第k個插入的數右側插入乙個數。

輸出格式

共一行,將整個鍊錶從左到右輸出。

資料範圍

1≤m≤100000

所有操作保證合法。

輸入樣例:

10r 7

d 1l 3

il 2 10

d 3il 2 7

l 8r 9

il 4 7

ir 2 2

輸出樣例:

8 7 7 3 2 9

#include

using

namespace std;

const

int n=

1e5+10;

// e[i] 儲存結點i的data域

// l[i] 儲存結點i的左邊結點的下標

// r[i] 儲存結點i的右邊結點的下標

// idex 表示當前用到哪個點了

int e[n]

,l[n]

,r[n]

,idx;

// 初始化

void

init()

// 在下標為k的點的右邊,插入x

void

add(

int k,

int x)

//add(l[k],x) 在下標為k的點的左邊,插入x

// 刪除第k個點

void

remove

(int k)

intmain()

else

if(op==

"r")

else

if(op==

"d")

else

if(op==

"il"

)else

if(op==

"ir")}

for(

int i=r[0]

;i!=

1;i=r[i]

) cout<<<

" ";

return0;

}

陣列模擬鍊錶

單鏈表 include using namespace std int head 1 idx 0,e 100005 ne 100005 void add head int x void remove int k void add int k,int x intmain else if a d 刪除元...

陣列模擬鍊錶

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

用兩個陣列模擬鍊錶

我們知道鍊錶中的每個節點有兩個部分,分別為資料域和指標域。我們可以用兩個陣列來模擬鍊錶中每個節點所對應的部分。我們首先可以用乙個整形陣列data來存放序列中的數字,另乙個陣列right來 存放當前序列中每個元素右邊的元素在陣列data中的位置。如下圖所示 例如right 1 的值為 2,就表示當前序...