基本思路
用三個陣列模擬雙鏈表,提高時間效率
模板
例題:雙鏈表// e表示節點的值,l表示節點的左指標,r表示節點的右指標,idx表示當前用到了哪個節點
int e[n]
, l[n]
, r[n]
, idx;
// 初始化
void
init()
// 在節點a的右邊插入乙個數x
void
insert
(int a,
int x)
// 刪除節點a
void
remove
(int a)
實現乙個雙鏈表,雙鏈表初始為空,支援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
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
[^1]此文章中的**和模板均來自www.acwing.com#include
using
namespace std;
const
int n =
100010
;int m;
int e[n]
, r[n]
, l[n]
, idx;
// e[n]儲存資料,r[n]儲存右指標,l[n]儲存左指標,idx表示當前操作的陣列下標
//函式功能:初始化
//注:陣列下標為0和1的節點不是鍊錶的內容,實際的鍊錶下標從2開始
void
init()
//函式功能:在第k個插入的節點有邊插入乙個新節點
void
add(
int k,
int x)
//函式功能:刪除下標為k的節點
void
remove_1
(int k)
intmain()
else
if(op ==
"r")
else
if(op ==
"d")
else
if(op ==
"il"
)else
}for
(int i = r[0]
; i !=
1; i = r[i]
)printf
("%d "
, e[i]);
return0;
}
C 資料結構 雙鏈表
據說單鏈表沒有迴路,那麼雙鏈表也出現了,既包括後繼指標,又加入了前驅指標,某個元素可以尋找他上面乙個元素,也可以尋找到下乙個元素。當然雙鏈表也是鍊錶的一種。物理儲存結構 不一定是連續的儲存區域 邏輯儲存結構 邏輯上儲存是連續的 使用場景 跟單鏈表一樣,適用於對資料的大量新增和刪除元素,對訪問元素無要...
資料結構 雙鏈表
typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...
資料結構 雙鏈表
目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...