當前位置:
首頁 >
数组模拟双链表
發布時間:2025/4/5
31
豆豆
雙鏈表
實現一個雙鏈表,雙鏈表初始為空,支持5種操作:
(1) 在最左側插入一個數;
(2) 在最右側插入一個數;
(3) 將第k個插入的數刪除;
(4) 在第k個插入的數左側插入一個數;
(5) 在第k個插入的數右側插入一個數
初始化
雙鏈表,需要開三個數組。
e[]存放該節點的數值,
l[] 數組存放該節點左邊的節點,
r[]數組存放該節點右邊的節點。
初始化:使用哨兵節點0和1,下標為0的節點記為頭結點head,下標為1的節點記為尾節點tail。
void init(){r[0]=1,l[1]=0;idx=2; }插入節點
在下標為k的節點右邊插入節點數值為x,該節點的下標為idx,首先需要e[idx]=x;然后分為四步,
step1:看該節點的右節點
step2:看該節點的左節點
step3:看原來的右節點的左節點
step4:看k的右節點
需要注意的是:step3和step4不能交換順序,這是因為r[k]存在被提前更新的風險。
void add(int k,int x){e[idx]=x;r[idx]=r[k];l[idx]=k;l[r[k]]=idx;//該步在前,防止r[k]被提前更新r[k]=idx;idx++; }
在k節點左邊插入一個節點,數值為x,相當于求l[k]l[k]l[k] 的右節點,只需要調用上述的add函數,將k改為k左邊的節點l[k]l[k]l[k]。
刪除節點
刪除下標為k的節點,只需要使得k的左節點 l[k]l[k]l[k]的右節點為r[k]r[k]r[k],相反,k的右節點r[k]r[k]r[k]的左節點變為l[k]l[k]l[k]。
void remove(int k){r[l[k]]=r[k];l[r[k]]=l[k]; }本題需要注意:
因為0和1號節點已經占用,所用第k個節點對應的是下標為k+1的節點。比如第1個節點,對應的下標是2.
ac代碼
#include<iostream> using namespace std; const int maxn=1e5+10;int l[maxn],r[maxn],e[maxn],idx;//初始化 void init(){//0表示左端點,1表示右端點r[0]=1,l[1]=0;idx=2;//因為0和1已經被占用 }//在下標為k的節點的右邊,插入一個點int add(int k,int x){e[idx]=x;r[idx]=r[k];l[idx]=k;l[r[k]]=idx;r[k]=idx;idx++; }//刪除第k個點 void remove(int k){r[l[k]]=r[k];l[r[k]]=l[k]; } int main(){init();int m,k,x;string op;cin>>m;while(m--){cin>>op;//cout<<op<<endl;if(op=="R"){cin>>x;add(l[1],x);}else if(op=="L"){cin>>x;add(0,x);}else if(op=="D"){cin>>k;remove(k+1);}else if(op=="IL"){cin>>k>>x;add(l[k+1],x);}else if(op=="IR"){cin>>k>>x;add(k+1,x);}}for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<" ";return 0;}總結
- 上一篇: 易收付是哪家支付公司
- 下一篇: opencv图片处理和摄像头边缘检测