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)

//gcc -o program test.c
//./program
//time ./program で時間計測
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
    int key;//格納する値
    struct node *prev,*next;//前の値、後ろの値のメモリの位置
};
struct node *nil;//番兵ノード
void init(){//リスト初期化用関数。
    nil=(struct node *)malloc(sizeof(struct node));//nodeが格納されるメモリを確保して、ポインタ型にキャストし番地をnilにいれる
    nil->next=nil;//一個も要素がないからnextにnilが入る。
    nil->prev=nil;
}
void insert(int key){//値xを先頭に追加
    struct node *x=(struct node *)malloc(sizeof(struct node));
    x->key=key;//ノードにkeyを代入
    x->next=nil->next;//番兵の直後にxを代入するため、番兵の元々次のノードをxの次のノードに設定する。
    x->prev=nil;//xは番兵の次に設定するのでprevには番兵を入れる
    nil->next->prev=x;//番兵の元々次のノードの前のノードにxを設定する
    nil->next=x;//番兵の元々次のノードの設定が終わりかつ、xに次のノードを設定したので番兵の次のノードにxを設定する
    return;
}
void delete(int key){//最初に見つけた値xを削除
    struct node *searcher=nil->next;//番兵の次のノードから探索を始める。
    while(searcher!=nil &&searcher->key!=key){//searcherが番兵に戻ってくるまで、または、searcherが目的のノードを見つけるまで繰り返す。
        searcher=searcher->next;//一個先のノードに移動
    }
    if(searcher==nil){//一周していたら値が見つからなかったと判断し何もせずに戻る。
        return;
    }
    searcher->prev->next=searcher->next;//searcherの前のノードの次をsearcherの次のノードに設定する
    searcher->next->prev=searcher->prev;//searcherの次のノードの前をsearcherの前のノードに設定する
    free(searcher);//searcherのメモリを開放(削除)する。
    return;
}
void deleteFirst(){//リストの先頭の値を削除
    struct node *target=nil->next;//番兵の次のノードを削除するので、targetに番兵の次のノードを設定する。
    nil->next=target->next;
    target->next->prev=nil;
    free(target);
    return;
}
void deleteLast(){//リストの末尾を削除
    struct node *target=nil->prev;//番兵の前（一番後ろ）をtargetにする
    nil->prev=target->prev;
    target->prev->next=nil;
    free(target);
    return;
}

int main(void){
    int command_number;
    int key;
    init();
    scanf("%d",&command_number);
    for(int i=0;i<command_number;i++){
        char command[16];
        int num;
        scanf("%s",command);
        if(strcmp(command,"deleteFirst")==0){
            deleteFirst();
        }else if(strcmp(command,"deleteLast")==0){
            deleteLast();
        }
        else{
            scanf("%d",&num);
            if(strcmp(command,"insert")==0){
                insert(num);
            }else if(strcmp(command,"delete")==0){
                delete(num);
            }
        }
    }
    struct node *output=nil->next;//一番最初のノードから始める
    while(1){
        printf("%d",output->key );
        if(output->next!=nil){
            output=output->next;
            printf(" ");
        }else{
            break;
        }
        
    }
    printf("\n");
    return 0;
}