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 <string.h>
#include <stdlib.h>

struct a {
	int data;
	struct a *next,*prev;
};
typedef struct a *NP;

NP make1node(int, NP,NP);
NP find(int);
NP del(int);
NP insert(int);
void print(void);

NP head;
NP tail;

int main() {
	int in,status,n,i,flag=0;
	char order[12];
	NP t;
	tail = make1node(-2,NULL,head);
	head = make1node(-1,tail,NULL);
	scanf("%d", &n);
	//printf("DEBUG1\n");
	for (i = 0; i < n; i++) {
		//printf("DEBUG2\n");
		scanf("%s", order);
		//printf("%d", i + 1);
		if (strcmp(order, "insert") == 0) {
			scanf("%d", &in);
			insert(in);
			/*if (flag == 0) {
				tail->prev = head->next;
				flag = 1;
			}*/
			//printf("Insert\n");
		}
		else if (strcmp(order, "delete") == 0) {
			scanf("%d", &in);
			del(in);
			//if (head->next == NULL && flag==1) flag = 0;
			//printf("Delete\n");
		}
		else if (strncmp(order, "deleteF",7) == 0) {
			t = head->next;
			head->next = t->next;
			t->next->prev = head;
			free(t);
			//printf("DleteFirst\n");
		}
		else if (strncmp(order, "deleteL",7) == 0) {
			/*t = head;
			while (t->next->next!=NULL) {
				t = t->next;
			}
			t->next = NULL;
			*/
			
			tail->prev=tail->prev->prev;
			tail->prev->next = tail;

			//free(tail->prev);

			//printf("DeleteLast\n");
		}
		//print();
	}
	//printf("DEBUG3\n");
	print();
	return 0;
}

NP make1node(int key, NP p1,NP p2) {
	NP n;
	n = (NP)malloc(sizeof(struct a));
	n->data = key;
	n->next = p1;
	n->prev = p2;
	return n;
}

NP find(int key) {
	NP n;
	for (n = head; n->next != NULL; n = n->next) {
		if (n->next->data == key) return n;
	}
	return NULL;
}

NP insert(int key) {
	NP newnode;
	newnode = make1node(key, head->next,head);

	head->next->prev = newnode;
	head->next = newnode;

	return newnode;
}

NP del(int key) {
	NP n,delnode;

	if ((n = find(key)) != NULL) {
		delnode = n->next;
		n->next = delnode->next;
		delnode->next->prev = n;
		free(delnode);
		return n;
	}
	else return NULL;
}

void print(void) {
	NP t;
	for (t = head->next; t->next != tail; t = t->next) {
		printf("%d ", t->data);
	}
	printf("%d\n", t->data);
}