实现一个双链表,双链表初始为空,支持5种操作:
(1) 在最左侧插入一个数;
(2) 在最右侧插入一个数;
(3) 将第k个插入的数删除;
(4) 在第k个插入的数左侧插入一个数;
(5) 在第k个插入的数右侧插入一个数
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。
#include<bits/stdc++.h> #define N 100010 using namespace std; struct node { int pe,net,v; }e[N]; int n,cut=1; void push(int x,int v) { cut++; e[cut].net=e[x].net; e[cut].pe=x; e[e[x].net].pe=cut; e[x].net=cut; e[cut].v=v; } void pop(int x) { e[e[x].net].pe=e[x].pe; e[e[x].pe].net=e[x].net; } int main() { scanf("%d",&n); e[0].net=cut; e[1].pe=0; for(int i=1;i<=n;i++) { string sl; int x,y; cin>>sl; scanf("%d",&x); if(sl=="L") push(0,x); if(sl=="R") push(e[1].pe,x); if(sl=="D") pop(x+1); if(sl=="IL"){scanf("%d",&y);push(e[x+1].pe,y);} if(sl=="IR"){scanf("%d",&y);push(x+1,y);} } for(int i=e[0].net;i!=1;i=e[i].net) printf("%d ",e[i].v); return 0; }