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



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

class Main {

  public static void main(String args[]) throws IOException{

	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int n = Integer.parseInt( br.readLine() );

      List Doublelink = new List();
      String[] order = new String[n];
      for(int i = 0; i < n; i++ ){
        order[i] =  br.readLine();
      }


      for(int i = 0; i < n; i++ ){

    	  String[] string =  order[i].split(" ");

    	  if( string[0].equals("insert") ){
    		  //System.out.println("check1 " + i);
    		  Doublelink.insert( Integer.parseInt( string[1] ) );
    		  //Doublelink.printlist();
    	  }
    	  else if( string[0].equals("delete") ){
    		  //System.out.println("check2 "+ i);
    		  Doublelink.delete( Integer.parseInt( string[1] ) );
    		 //Doublelink.printlist();
    	  }
    	  else if( string[0].equals("deleteFirst") ){
    		 //System.out.println("check3 " + i);
    		  Doublelink.deleteFirst();
    		  //Doublelink.printlist();

    	  }
    	  else if( string[0].equals("deleteLast") ){
    		 //System.out.println("check4 " + i);
    		  Doublelink.deleteLast();
    		 //Doublelink.printlist();

    	  }

    	 // System.out.println(n);
      }

      Doublelink.printlist();

 }
}


class Cell{

	Cell prev;
	Cell next;
	long data;

	Cell(long d) {
	   data = d;
	}

	void setNext(Cell next) {
        this.next = next;
    }
    // next?????????
    Cell getNext() {
        return next;
    }
    // prev??????????????????
    void setPrev(Cell prev) {
        this.prev = prev;
    }
    // prev?????????
   Cell getPrev() {
        return prev;
    }
    // ??????????????????
    long getData() {
        return data;
    }

}

class List{

    Cell dummy;

    Cell tail;

	List() {
        // ??????????????????????????????next??¨prev????????????????????????????¨??????????
        dummy = new Cell(0);
        dummy.next = dummy;
        dummy.prev = dummy;
        tail = dummy;
    }


	void insert(long data) {//?????????????´?????????\
        // ???????????????

        Cell c = new Cell(data);
        c.next = dummy.next;
        c.prev = dummy;
        dummy.next.prev = c;
        dummy.next = c;
        tail = dummy.prev;

    }

	void deleteFirst() {//?????????????´??????????
        Cell c = dummy.getNext();
        c.next.prev=(c.prev);
        c.prev.next = c.next;
        tail = dummy.prev;
    }

	void deleteLast() {//????°????????´??????????

        Cell tmpcell;
        tmpcell = tail.prev;
        tail.next.prev =  tail.prev ;
        tail.prev.next =  tail.next;
        tail = tmpcell;
    }

	void delete(long data ) {//???????????????????´??????????


		Cell deletecell = dummy.next;


        while( deletecell != dummy){

        	if( deletecell.data == data ){


        		deletecell.prev.next =  deletecell.next;
        		deletecell.next.prev = deletecell.prev;
        		//deletecell.getPrev().setNext( deletecell.getNext() );
                //deletecell.getNext().setPrev( deletecell.getPrev() );

                break;
        	}
        	deletecell = deletecell.next;

        }


        tail = dummy.prev;
	}

	void printlist() {//??????????????¨???

		Cell end = dummy.next;
        while(end!=dummy){
        	//System.out.println("checkfinal");
        	System.out.print( end.data );


        	if(end.next != dummy){
            	System.out.print( " " );
            }
        	end = end.next;
        }

        System.out.println();

	}

}