python基礎13-item/__str__方法/__format__方法/__slots__方法/_cal_方法
阿新 • • 發佈:2022-01-18
雙鏈表和單鏈表其實大同小異,單鏈表原理知道之後,雙鏈表知道結構可以直接寫出來,upupup!
//雙鏈錶板子 const int N=100010; int l[N],r[N],e[N];//l表示左邊的點,r表示右邊的點,e表示當前點 int idx; //初始化 void init(){ //0表示左端點,1表示右端點 r[0]=1,l[1]=0;//0的右邊是1,1的左邊是0 idx=2;//0和1已經被佔用過了 } void add(int k,int x)//在下標是k的點右邊插入x { e[idx]=x; r[idx]=r[k]; l[idx]=k; l[r[k]]=idx; r[k]=idx;//順序要記好,不能改順序 idx++; } //如果想在k的左邊插入一個點,可以add(l[k],x) void remove(int k)//刪除第k個點 { r[l[k]]=r[k]; l[r[k]]=l[k]; }
雙鏈表,上題:
實現一個雙鏈表,雙鏈表初始為空,支援55種操作:
- 在最左側插入一個數;
- 在最右側插入一個數;
- 將第kk個插入的數刪除;
- 在第kk個插入的數左側插入一個數;
- 在第kk個插入的數右側插入一個數
現在要對該連結串列進行MM次操作,進行完所有操作後,從左到右輸出整個連結串列。
注意:題目中第kk個插入的數並不是指當前連結串列的第 kk個數。例如操作過程中一共插入了nn個數,則按照插入的時間順序,這nn個數依次為:第11個插入的數,第22個插入的數,…第nn個插入的數。
輸入格式
第一行包含整數MM,表示操作次數。
接下來MM行,每行包含一個操作命令,操作命令可能為以下幾種:
L x
,表示在連結串列的最左端插入數xx。R x
,表示在連結串列的最右端插入數xx。D k
,表示將第kk個插入的數刪除。IL k x
,表示在第kk個插入的數左側插入一個數。IR k x
,表示在第kk個插入的數右側插入一個數。
輸出格式
共一行,將整個連結串列從左到右輸出。
資料範圍
1≤M≤1000001≤M≤100000
所有操作保證合法。
輸入樣例:
10 R 7 D 1 L 3 IL 2 10 D 3 IL 2 7 L 8 R 9 IL 4 7 IR 2 2
輸出樣例:
8 7 7 3 2 9
#include<iostream> using namespace std; const int N=100010; int l[N],r[N],e[N]; int idx,head; void init(){ r[0]=1,l[1]=0; idx=2; } void add(int k,int x)//右邊 { e[idx]=x; r[idx]=r[k]; l[idx]=k; l[r[k]]=idx; r[k]=idx; idx++; } void remove(int k) { r[l[k]]=r[k]; l[r[k]]=l[k]; } int main(){ int n; init(); cin>>n; while(n--) { string ch; cin>>ch; if(ch=="L") { int x; cin>>x; add(0,x); } if(ch=="R") { int x; cin>>x; add(l[1],x); } if(ch=="D") { int k; cin>>k; remove(k+1);//idx是從2開始,第k個數的下標是k+1 } if(ch=="IL") { int k,x; cin>>k>>x; add(l[k+1],x); } if(ch=="IR") { int k,x; cin>>k>>x; add(k+1,x); } } for(int i=r[0];i!=1;i=r[i]) { cout<<e[i]<<" "; } }
gogogo