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 JAVA (judge verdict: Runtime Error)

import java.util.*;

public class Main{
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		dList dl = new dList();
		long n, key;
		String command;
		
		n = sc.nextLong();
		
		for(long i = 0; i < n; i++){
			command = sc.next();
			
			if(command.equals("deleteFirst")){
				dl.deleteFirst();
			}
			else if(command.equals("deleteLast")){
				dl.deleteLast();
			}
			else{
				key = sc.nextLong();
				
				if(command.equals("insert")){
					dl.insert(key);
				}
				else if(command.equals("delete")){
					dl.delete(key);
				}
			}
			
		}
		
		dl.viewList();
	}
}

class element{
	long key;
	element prev, next;
	
	element(long key){
		this.key = key;
	}
}

class dList{
	element dummy;
	
	dList(){
		dummy = new element(-1);
	}
	
	void insert(long x){
		element newE = new element(x);
		
		if(dummy.next == null){
			dummy.next = newE;
			newE.prev = dummy;
		}
		else{
			newE.prev = dummy;
			newE.next = dummy.next;
			dummy.next.prev = newE;
			dummy.next = newE;
		}
	}
	
	void delete(long x){
		element delE = dummy;
		int isExist = 0;
		
		while(delE.next != null){
			if(delE.key == x){
				isExist = 1;
				break;
			}
			delE = delE.next;
		}
		
		if(delE.next == null && delE.key == x){
			delE.prev.next = null;
		}
		else if(isExist == 1){
			delE.next.prev = delE.prev;
			delE.prev.next = delE.next;
		}
	}
	
	void deleteFirst(){
		dummy.next.next.prev = dummy;
		dummy.next = dummy.next.next;
	}
	
	void deleteLast(){
		element last = dummy;
		
		while(last.next != null){
			last = last.next;
		}
		
		last.prev.next = null;
		last.prev = null;
	}
	
	void viewList(){
		element ele = dummy.next;
		StringBuilder sb = new StringBuilder();
		
		while(ele != null){
			sb.append(ele.key + " ");
			ele = ele.next;
		}
		
		sb.deleteCharAt(sb.length() - 1);
		
		System.out.println(sb.toString());
	}
}