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>

#define N 15

struct Link{
  int linkkey;
  struct Link *Next;
  struct Link *Before;
};

typedef struct Link * LinkSearch;

LinkSearch Target;

void LinkIn(int );
void DelFast();
void DelLast();
void Dellinkkey(int );
void DelLink(LinkSearch );
LinkSearch Search(int );


int main(){
  LinkSearch link;
  int count=0;
  int loop,linknum;
  char order[N];
  int i;

  Target=malloc(sizeof(struct Link));
  Target->Next=Target;
  Target->Before=Target;

  scanf("%d",&loop);

  for(i=0;i<loop;i++){
    scanf("%s",order);
    
    if(order[0]=='i'){
      scanf("%d",&linknum);
      LinkIn(linknum);
    }
    
    else if(order[0]=='d'){
      if(strlen(order)==6){
	scanf("%d",&linknum);
	Dellinkkey(linknum);
      }
      
      else if(strlen(order)>6){
	
	if(order[6]=='F'){
	DelFast();
	}

	else if(order[6]=='L'){
	  DelLast();
	}
	
      }
    }
  }
  
  link=Target->Next;
  
  while(link!=Target){
   
    if(count>=1){
      printf(" ");
    }

    printf("%d",link->linkkey);
    link=link->Next;
    count++;
  }

  printf("\n");
  
  
  return 0;
}

void LinkIn(int number){
  LinkSearch insert;

  insert=malloc(sizeof(struct Link));
  
  insert->linkkey=number;
  
  insert->Next=Target->Next;
  
  Target->Next->Before=insert;
  
  Target->Next=insert;
  
  insert->Before=Target;
  
}

void DelFast(){
  LinkSearch First;

  First=Target->Next;
  
  if(First==Target){
    return;
  }
  
  DelLink(First);
}

void DelLast(){
  LinkSearch Last;

  Last=Target->Before;
  
  if(Last==Target){
    return;
  }
  
  DelLink(Last);
}

void Dellinkkey(int number){
  
  DelLink(Search(number));
  
}

void DelLink(LinkSearch Erase){

  if(Erase==Target){
    return;
  }

  Erase->Before->Next=Erase->Next;
  
  Erase->Next->Before=Erase->Before;
  
  free(Erase);
  
}

LinkSearch Search(int linknum){
  LinkSearch Sear;

  Sear=Target->Next;

  while((Sear!=Target) && (Sear->linkkey!=linknum)){
    Sear=Sear->Next;
  }

  return Sear;
}