#include <iostream>
using namespace std;
class node {
public:
   int data;
   node* next;
   node* prev;
   node(int val) {
       data = val;
       next = prev = nullptr;
   }
};
void insertAtHead(node* &head, int val) {
   node* n = new node(val);
   n->next = head;
   if (head != nullptr) {
       head->prev = n;
   }
   head = n;
}
void deleteAtHead(node* &head) {
   if (head == nullptr) {
       return;
   }
   node* todelete = head;
   head = head->next;
   if (head != nullptr) {
       head->prev = nullptr;
   }
   delete todelete;
}
void deletion(node* &head, int val) {
   if (head == nullptr) {
       return;
   }
   if (head->data == val) {
       deleteAtHead(head);
       return;
   }
   node* temp = head;
   while (temp->next != nullptr && temp->next->data != val) {
       temp = temp->next;
   }
   if (temp->next == nullptr) {
     return;
  }
  node* todelete = temp->next;
  temp->next = todelete->next;
  if (todelete->next != nullptr) {
      todelete->next->prev = temp;
  }
  delete todelete;
}
void insertAtTail(node* &head, int val) {
   node* n = new node(val);
   if (head == nullptr) {
       head = n;
   } else {
       node* temp = head;
       while (temp->next != nullptr) {
         temp = temp->next;
       }
       temp->next = n;
       n->prev = temp;
   }
}
void display(node* head) {
   node* temp = head;
   while (temp != nullptr) {
       cout << temp->data << " <-> ";
       temp = temp->next;
   }
   cout << "NULL" << endl;
}
int main() {
   node* head = nullptr;
   insertAtTail(head, 1);
   insertAtTail(head, 2);
   insertAtHead(head, 3);
   insertAtTail(head, 4);
   cout << "Before deletion: ";
   display(head);
   deleteAtHead(head);
   cout << "After deletion: ";
   display(head);
   return 0;
}