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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;

public class Main {

	public BufferedReader br;

	/**
	 * メイン処理
	 * @throws IOException
	 */
	public void Proc() throws IOException {
		int commandCount = Integer.parseInt(br.readLine());
		int itemCount = 0;
		Node first = null;
		Node last = null;
		for(int i=0; i<commandCount; i++) {
			String[] inpt = br.readLine().split(" ");
			int num = 0;
			if(inpt.length > 1) {
				num = Integer.parseInt(inpt[1]);
			}
			if(inpt[0].equals("insert")) {
				Node n = new Node();
				n.Number = num;
				if(first != null) {
					first.Prev = n;
					n.Next = first;
				}
				first = n;
				if(last == null) {
					last = n;
				}
				itemCount++;
			} else if(inpt[0].equals("delete")) {
				if(first != null) {
					Node target = first;
					while(target != null) {
						if(target.Number == num) {
							if(target.Prev != null && target.Next != null) {
								target.Prev.Next = target.Next;
								target.Next.Prev = target.Prev;
							} else if(target.Prev != null) {
								target.Prev.Next = null;
							} else if(target.Next != null) {
								target.Next.Prev = null;
							}
							if(target.Next == null) {
								last = target.Prev;
							}
							if(target.Prev == null) {
								first = target.Next;
							}
							itemCount--;
							break;
						} else {
							target = target.Next;
						}
					}
				}
			} else if(inpt[0].equals("deleteFirst")) {
				if(first != null) {
					if(first.Next != null) {
						first.Next.Prev = null;
					}
					first = first.Next;
					itemCount--;
				}
			} else if(inpt[0].equals("deleteLast")) {
				if(last != null) {
					if(last.Prev != null) {
						last.Prev.Next = null;
					}
					last = last.Prev;
					itemCount--;
				}
			}
		}

		Node nd = first;
		StringBuilder ans = new StringBuilder();
		while(nd != null) {
			if(ans.length() > 0) {
				ans.append(" ");
			}
			ans.append(nd.Number);
			nd = nd.Next;
		}
		System.out.println(ans.toString());
	}

	public class Node {
		public int Number ;
		public Node Next = null;
		public Node Prev = null;
	}


	public static void main(String[] args)  {
		Main mn = new Main();
		mn.br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
		try {
			mn.Proc();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} finally {
			try {
				mn.br.close();
			} catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
	}


}