用陣列模擬單鏈表
資料結構課本上的單鏈表演算法,在建立每個結點時都需要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,就表示當前序...