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: Memory Limit Exceeded)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); 

		int n = sc.nextInt();
		DLL dll = new DLL();
		for (int i = 0; i < n; i++) {
			String cmd = sc.next();
			if (cmd.equals("insert")) {
				dll.insert(sc.nextInt());
			} else if (cmd.equals("delete")) {
				dll.delete(sc.nextInt());
			} else if (cmd.equals("deleteFirst")) {
				dll.deleteFirst();
			} else if (cmd.equals("deleteLast")) {
				dll.deleteLast();
			}
			if (i % 500000 == 0) {
				System.gc();
			}
		}
    	
		StringBuffer printData = new StringBuffer();
		for (DLLelement next = dll.first; next != null; next = next.next) {
			printData.append(next.data);
			printData.append(" ");
		}
		printData.delete(printData.length() - 1, printData.length());
		System.out.println(printData);

		sc.close();
	}
}

class DLL {
	DLLelement first;
	DLLelement last;
	
	DLL() {
		first = null;
		last = null;
	}
	
	void insert(int x) {
		if (last == null) {
			first = new DLLelement(x, first, null);
			last = first;
		} else {
			first = new DLLelement(x, first, null);
			first.next.prev = first;
		}
	}

	void delete(int x) {
		for (DLLelement next = first; next != null; next = next.next) {
			if (next.data == x) {
				if (next.prev == null) {
					first = next.next;
					if (first == null) {
						last = null;
					} else {
						first.prev = null;
					}
				} else if (next.next == null) {
					last = next.prev;
					if (last == null) {
						first = null;
					} else {
						last.next = null;
					}
				} else {
					next.prev.next = next.next;
					next.next.prev = next.prev;
				}
				return;
			}
		}
//		System.out.println("not found");
	}

	void deleteFirst() {
		if (first == null) {
//			System.out.println("not found");
			return;
		} else {
			first = first.next;
			if (first == null) {
				last = null;
				return;
			}
			first.prev = null;
		}
	}

	void deleteLast() {
		if (last == null) {
//			System.out.println("not found");
			return;
		} else {
			last = last.prev;
			if (last == null) {
				first = null;
				return;
			}
			last.next = null;
		}
	}
}

class DLLelement {
	int data;
	DLLelement next;
	DLLelement prev;
	
	DLLelement(int x, DLLelement next, DLLelement prev) {
		data = x;
		this.next = next;
		this.prev = prev;
	}
}