Problem:
Doubly Linked List

Your task is to implement a double linked list.

Write a program which performs the following operations:

insert x: insert an element with key x into the front of the list.

delete x: delete the first element which has the key of x from the list. If there is not such element, you need not do anything.

deleteFirst: delete the first element from the list.

deleteLast: delete the last element from the list.

Input

The input is given in the following format:

n

command1

command2

...

commandn

In the first line, the number of operations n is given. In the following n lines, the above mentioned operations are given in the following format:

insert x

delete x

deleteFirst

deleteLast

Output

Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.

Constraints

The number of operations ≤ 2,000,000

The number of delete operations ≤ 20

0 ≤ value of a key ≤ 109

The number of elements in the list does not exceed 106

For a delete, deleteFirst or deleteLast operation, there is at least one element in the list.

Sample Input 1

7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5

Sample Output 1

6 1 2

Sample Input 2

9
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
deleteFirst
deleteLast

Sample Output 2

1

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
struct node{
  struct node *prev;
  int number;
  struct node *next;
};
 
typedef struct node* NodePointer;
 
NodePointer N;
 
void init(void);
void insert(int);
void delete(int);
void deleteFirst(void);
void deleteLast(void);
void printList(void);
 
int main(){
  int i, n, a;
  char c[12];
 
  scanf("%d",&n);
 
  init();
 
  for(i = 1; i <= n; i++){
    scanf("%s",c);
 
    if(strcmp(c, "deleteFirst") == 0) deleteFirst();
 
    else if(strcmp(c, "deleteLast") == 0) deleteLast();
 
    else if(strcmp(c, "insert") == 0 || strcmp(c, "delete") == 0){
      scanf("%d",&a);
 
      if(strcmp(c, "insert") == 0) insert(a);
 
      else delete(a);
    }
  }
 
  printList();
 
  return 0;
}
 
void init(void){
  N = malloc(sizeof(struct node));
  N->next = N;
  N->prev = N;
}
 
void insert(int a){
  NodePointer new;
  static int count = 0;
 
  new = malloc(sizeof(struct node));
 
  new->number = a;
   
  if(count == 0){
    new->next = N;
    N->next = new;
    new->prev = N;
    N->prev = new;
    count++;
  }
 
  else{
    new->next = N->next;
    N->next->prev = new;
    N->next = new;
    new->prev = N;
    count++;
  }
}
 
void delete(int a){
  int judge = 0;
  NodePointer x;
  NodePointer y; 
   
  for(y = N->next; y != N; y = y->next){
    if(y->number == a){
      judge = 1;
    }
  }
   
  if(judge == 1){
    y = N->next;
 
    while(y != N){
      if(y->number == a) break;
      y = y->next;
    }
 
    x = y->prev;
    x->next = y->next;
    x->next->prev = x;
    free(y);
  }
}
 
void deleteFirst(void){
  NodePointer x = N->next;
  N->next = x->next;
  x->next->prev = N;
}
 
void deleteLast(void){
  NodePointer x = N->prev;
  N->prev = x->prev;
  x->prev->next = N;
  free(x);
}
 
void printList(void){
  NodePointer x = N->next;
  int y = 1;
 
  while(x != N){
    if (y == 0) printf(" ");
    printf("%d", x->number);
    x = x->next;
    y = 0;
  }
 
  printf("\n");
}