// P.02.01 (Operations on Singly Linked Lists)
// Code by Vani
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct Node {
int value;
struct Node* next;
} Node;
Node* makeNode(int v) {
Node
* p
= (Node
*)malloc(sizeof(Node
)); if(p == NULL) return NULL;
p -> value = v;
p -> next = NULL;
return p;
}
void printList(Node* h) {
Node* p = h;
while(p != NULL) {
p = p -> next;
}
}
bool find(Node* head, int val) {
Node* p = head;
while(p != NULL) {
if(p -> value == val) return true;
p = p -> next;
}
return false;
}
Node* addFirst(Node* head, int v) {
if(find(head, v)) return head;
Node* new_node = makeNode(v);
new_node -> next = head;
return new_node;
}
Node* addLast(Node* head, int v) {
if(find(head, v)) return head;
Node* new_node = makeNode(v);
if(head == NULL) return new_node;
Node* p = head;
while(p -> next != NULL) p = p -> next;
p -> next = new_node;
return head;
}
Node* addAfter(Node* head, int u, int v) {
if(find(head, u) || !find(head, v)) return head;
Node* p = head;
while(p != NULL && p -> value != v) p = p -> next;
if(p != NULL) {
Node* new_node = makeNode(u);
new_node -> next = p -> next;
p -> next = new_node;
}
return head;
}
Node* addBefore(Node* head, int u, int v) {
if(find(head, u) || !find(head, v)) return head;
if(head != NULL && head -> value == v) {
return addFirst(head, u);
}
Node* p = head;
while(p != NULL && p -> next != NULL && p->next->value != v) p = p-> next;
if(p != NULL && p-> next != NULL) {
Node* new_node = makeNode(u);
new_node -> next = p -> next;
p -> next = new_node;
}
return head;
}
Node* removeNode(Node* head, int k) {
if(head == NULL) return NULL;
if(head -> value == k) {
Node* temp = head;
head = head -> next;
return head;
}
Node* p = head;
while(p -> next != NULL && p -> next -> value != k) {
p = p -> next;
}
if(p -> next != NULL) {
Node* temp = p -> next;
p -> next = p -> next -> next;
}
return head;
}
Node* reverse(Node* head) {
Node* prev = NULL;
Node* current = head;
Node* next = NULL;
while(current != NULL) {
next = current -> next;
current -> next = prev;
prev = current;
current = next;
}
return prev;
}
void vaniinput() {
Node *head = NULL, *tail = NULL;
for(int i = 0; i < n; i++) {
Node *new_node = makeNode(k);
if(head == NULL) {
head = new_node;
tail = new_node;
} else {
tail -> next = new_node;
tail = new_node;
}
}
char cmd[50];
while(scanf("%s", cmd
) == 1 && strcmp(cmd
, "#") != 0) { if(strcmp(cmd
, "addlast") == 0) { head = addLast(head, k);
} else if(strcmp(cmd
, "addfirst") == 0) { head = addFirst(head, k);
} else if(strcmp(cmd
, "addafter") == 0) { int u
, v
; scanf("%d %d", &u
, &v
); head = addAfter(head, u, v);
} else if(strcmp(cmd
, "addbefore") == 0) { int u
, v
; scanf("%d %d", &u
, &v
); head = addBefore(head, u, v);
} else if(strcmp(cmd
, "remove") == 0) { head = removeNode(head, k);
} else if(strcmp(cmd
, "reverse") == 0) { head = reverse(head);
}
}
printList(head);
}
void vanimain() {
vaniinput();
}
int main() {
vanimain();
return 0;
}
Ly8gUC4wMi4wMSAoT3BlcmF0aW9ucyBvbiBTaW5nbHkgTGlua2VkIExpc3RzKQovLyBDb2RlIGJ5IFZhbmkgCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+Cgp0eXBlZGVmIHN0cnVjdCBOb2RlIHsKICAgIGludCB2YWx1ZTsKICAgIHN0cnVjdCBOb2RlKiBuZXh0Owp9IE5vZGU7CgpOb2RlKiBtYWtlTm9kZShpbnQgdikgewogICAgTm9kZSogcCA9IChOb2RlKiltYWxsb2Moc2l6ZW9mKE5vZGUpKTsKICAgIGlmKHAgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAgICBwIC0+IHZhbHVlID0gdjsKICAgIHAgLT4gbmV4dCA9IE5VTEw7CiAgICByZXR1cm4gcDsKfQoKdm9pZCBwcmludExpc3QoTm9kZSogaCkgewogICAgTm9kZSogcCA9IGg7CiAgICB3aGlsZShwICE9IE5VTEwpIHsKICAgICAgICBwcmludGYoIiVkICIsIHAgLT4gdmFsdWUpOwogICAgICAgIHAgPSBwIC0+IG5leHQ7CiAgICB9Cn0KCmJvb2wgZmluZChOb2RlKiBoZWFkLCBpbnQgdmFsKSB7CiAgICBOb2RlKiBwID0gaGVhZDsKICAgIHdoaWxlKHAgIT0gTlVMTCkgewogICAgICAgIGlmKHAgLT4gdmFsdWUgPT0gdmFsKSByZXR1cm4gdHJ1ZTsKICAgICAgICBwID0gcCAtPiBuZXh0OwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpOb2RlKiBhZGRGaXJzdChOb2RlKiBoZWFkLCBpbnQgdikgewogICAgaWYoZmluZChoZWFkLCB2KSkgcmV0dXJuIGhlYWQ7CiAgICBOb2RlKiBuZXdfbm9kZSA9IG1ha2VOb2RlKHYpOwogICAgbmV3X25vZGUgLT4gbmV4dCA9IGhlYWQ7CiAgICByZXR1cm4gbmV3X25vZGU7Cn0KCk5vZGUqIGFkZExhc3QoTm9kZSogaGVhZCwgaW50IHYpIHsKICAgIGlmKGZpbmQoaGVhZCwgdikpIHJldHVybiBoZWFkOwogICAgTm9kZSogbmV3X25vZGUgPSBtYWtlTm9kZSh2KTsKICAgIGlmKGhlYWQgPT0gTlVMTCkgcmV0dXJuIG5ld19ub2RlOwoKICAgIE5vZGUqIHAgPSBoZWFkOwogICAgd2hpbGUocCAtPiBuZXh0ICE9IE5VTEwpIHAgPSBwIC0+IG5leHQ7CiAgICBwIC0+IG5leHQgPSBuZXdfbm9kZTsKICAgIHJldHVybiBoZWFkOwp9CgpOb2RlKiBhZGRBZnRlcihOb2RlKiBoZWFkLCBpbnQgdSwgaW50IHYpIHsKICAgIGlmKGZpbmQoaGVhZCwgdSkgfHwgIWZpbmQoaGVhZCwgdikpIHJldHVybiBoZWFkOwogICAgTm9kZSogcCA9IGhlYWQ7CiAgICB3aGlsZShwICE9IE5VTEwgJiYgcCAtPiB2YWx1ZSAhPSB2KSBwID0gcCAtPiBuZXh0OwogICAgaWYocCAhPSBOVUxMKSB7CiAgICAgICAgTm9kZSogbmV3X25vZGUgPSBtYWtlTm9kZSh1KTsKICAgICAgICBuZXdfbm9kZSAtPiBuZXh0ID0gcCAtPiBuZXh0OwogICAgICAgIHAgLT4gbmV4dCA9IG5ld19ub2RlOwogICAgfQogICAgcmV0dXJuIGhlYWQ7Cn0KCk5vZGUqIGFkZEJlZm9yZShOb2RlKiBoZWFkLCBpbnQgdSwgaW50IHYpIHsKICAgIGlmKGZpbmQoaGVhZCwgdSkgfHwgIWZpbmQoaGVhZCwgdikpIHJldHVybiBoZWFkOwogICAgaWYoaGVhZCAhPSBOVUxMICYmIGhlYWQgLT4gdmFsdWUgPT0gdikgewogICAgICAgIHJldHVybiBhZGRGaXJzdChoZWFkLCB1KTsKICAgIH0KICAgIE5vZGUqIHAgPSBoZWFkOwogICAgd2hpbGUocCAhPSBOVUxMICYmIHAgLT4gbmV4dCAhPSBOVUxMICYmIHAtPm5leHQtPnZhbHVlICE9IHYpIHAgPSBwLT4gbmV4dDsKICAgIGlmKHAgIT0gTlVMTCAmJiBwLT4gbmV4dCAhPSBOVUxMKSB7CiAgICAgICAgTm9kZSogbmV3X25vZGUgPSBtYWtlTm9kZSh1KTsKICAgICAgICBuZXdfbm9kZSAtPiBuZXh0ID0gcCAtPiBuZXh0OwogICAgICAgIHAgLT4gbmV4dCA9IG5ld19ub2RlOwogICAgfQogICAgcmV0dXJuIGhlYWQ7Cn0KCk5vZGUqIHJlbW92ZU5vZGUoTm9kZSogaGVhZCwgaW50IGspIHsKICAgIGlmKGhlYWQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAgICBpZihoZWFkIC0+IHZhbHVlID09IGspIHsKICAgICAgICBOb2RlKiB0ZW1wID0gaGVhZDsKICAgICAgICBoZWFkID0gaGVhZCAtPiBuZXh0OwogICAgICAgIGZyZWUodGVtcCk7CiAgICAgICAgcmV0dXJuIGhlYWQ7CiAgICB9CiAgICBOb2RlKiBwID0gaGVhZDsKICAgIHdoaWxlKHAgLT4gbmV4dCAhPSBOVUxMICYmIHAgLT4gbmV4dCAtPiB2YWx1ZSAhPSBrKSB7CiAgICAgICAgcCA9IHAgLT4gbmV4dDsKICAgIH0KICAgIGlmKHAgLT4gbmV4dCAhPSBOVUxMKSB7CiAgICAgICAgTm9kZSogdGVtcCA9IHAgLT4gbmV4dDsKICAgICAgICBwIC0+IG5leHQgPSBwIC0+IG5leHQgLT4gbmV4dDsKICAgICAgICBmcmVlKHRlbXApOwogICAgfQogICAgcmV0dXJuIGhlYWQ7Cn0KCk5vZGUqIHJldmVyc2UoTm9kZSogaGVhZCkgewogICAgTm9kZSogcHJldiA9IE5VTEw7CiAgICBOb2RlKiBjdXJyZW50ID0gaGVhZDsKICAgIE5vZGUqIG5leHQgPSBOVUxMOwogICAgd2hpbGUoY3VycmVudCAhPSBOVUxMKSB7CiAgICAgICAgbmV4dCA9IGN1cnJlbnQgLT4gbmV4dDsKICAgICAgICBjdXJyZW50IC0+IG5leHQgPSBwcmV2OwogICAgICAgIHByZXYgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgfQogICAgcmV0dXJuIHByZXY7Cn0KCnZvaWQgdmFuaWlucHV0KCkgewogICAgaW50IG47IHNjYW5mKCIlZCIsICZuKTsKICAgIE5vZGUgKmhlYWQgPSBOVUxMLCAqdGFpbCA9IE5VTEw7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaW50IGs7IHNjYW5mKCIlZCIsICZrKTsKICAgICAgICBOb2RlICpuZXdfbm9kZSA9IG1ha2VOb2RlKGspOwogICAgICAgIGlmKGhlYWQgPT0gTlVMTCkgewogICAgICAgICAgICBoZWFkID0gbmV3X25vZGU7CiAgICAgICAgICAgIHRhaWwgPSBuZXdfbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0YWlsIC0+IG5leHQgPSBuZXdfbm9kZTsKICAgICAgICAgICAgdGFpbCA9IG5ld19ub2RlOwogICAgICAgIH0KICAgIH0KCiAgICBjaGFyIGNtZFs1MF07CiAgICB3aGlsZShzY2FuZigiJXMiLCBjbWQpID09IDEgJiYgc3RyY21wKGNtZCwgIiMiKSAhPSAwKSB7CiAgICAgICAgaWYoc3RyY21wKGNtZCwgImFkZGxhc3QiKSA9PSAwKSB7CiAgICAgICAgICAgIGludCBrOyBzY2FuZigiJWQiLCAmayk7CiAgICAgICAgICAgIGhlYWQgPSBhZGRMYXN0KGhlYWQsIGspOwogICAgICAgIH0gZWxzZSBpZihzdHJjbXAoY21kLCAiYWRkZmlyc3QiKSA9PSAwKSB7CiAgICAgICAgICAgIGludCBrOyBzY2FuZigiJWQiLCAmayk7CiAgICAgICAgICAgIGhlYWQgPSBhZGRGaXJzdChoZWFkLCBrKTsKICAgICAgICB9IGVsc2UgaWYoc3RyY21wKGNtZCwgImFkZGFmdGVyIikgPT0gMCkgewogICAgICAgICAgICBpbnQgdSwgdjsgc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKICAgICAgICAgICAgaGVhZCA9IGFkZEFmdGVyKGhlYWQsIHUsIHYpOwogICAgICAgIH0gZWxzZSBpZihzdHJjbXAoY21kLCAiYWRkYmVmb3JlIikgPT0gMCkgewogICAgICAgICAgICBpbnQgdSwgdjsgc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKICAgICAgICAgICAgaGVhZCA9IGFkZEJlZm9yZShoZWFkLCB1LCB2KTsKICAgICAgICB9IGVsc2UgaWYoc3RyY21wKGNtZCwgInJlbW92ZSIpID09IDApIHsKICAgICAgICAgICAgaW50IGs7IHNjYW5mKCIlZCIsICZrKTsKICAgICAgICAgICAgaGVhZCA9IHJlbW92ZU5vZGUoaGVhZCwgayk7CiAgICAgICAgfSBlbHNlIGlmKHN0cmNtcChjbWQsICJyZXZlcnNlIikgPT0gMCkgewogICAgICAgICAgICBoZWFkID0gcmV2ZXJzZShoZWFkKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpbnRMaXN0KGhlYWQpOwp9Cgp2b2lkIHZhbmltYWluKCkgewogICAgdmFuaWlucHV0KCk7Cn0KCmludCBtYWluKCkgewogICAgdmFuaW1haW4oKTsKICAgIHJldHVybiAwOwp9Cg==