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
#include <cstdio>
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;
struct Node {
int k;
Node *next, *prev;
};
Node *nil;
void init() {
nil = (Node *) malloc(sizeof(Node));
nil->next = nil;
nil->prev = nil;
}
Node *list_se(int k) {
Node *c = nil->next;
while (c != nil && c->k != k)
c = c->next;
return c;
}
void print_list() {
Node *c = nil->next;
int isf = 0;
while (true) {
if (c == nil) break;
if (isf++ > 0) cout << ' ';
printf("%d", c->k);
c = c->next;
}
cout << endl;
}
void delete_Node(Node *t) {
if (t == nil) return;
t->prev->next = t->next;
t->next->prev = t->prev;
free(t);
}
void delete_first() { delete_Node(nil->next); }
void delete_last() { delete_Node(nil->prev); }
void delete_k(int k) { delete_Node(list_se(k)); }
void insert(int k) {
Node *x = (Node *) malloc(sizeof(Node));
x->k = k;
x->next = nil->next;
nil->next->prev = x;
nil->next = x;
x->prev = nil;
}
int main() {
init();
string co;
int k, n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
cin >> co;
switch (co[0]) {
case 'i':
cin >> k;
insert(k);
break;
case 'd':
if (co.length() > 6) {
switch (co[6]) {
case 'F':
delete_first();
break;
case 'L':
delete_last();
break;
}
} else {
cin >> k;
delete_k(k);
}
break;
}
}
print_list();
return 0;
}