Doubly Linked List Insertion and Deletion Program in C++
Doubly Linked List Insertion and Deletion in C++
We will explore all the different methods to do insertion and deletion in a doubly-linked list in C++ using struct, classes and class functions. Let us go!
A doubly Linked list is sometimes used over the singly Linked list in C++ since they allow traversal in both forward and backward directions. While singly linked list allowed traversal in backward direction only.
Definition
A Doubly Linked list is a data structure that contains a chain of nodes connected to one another and where each node has a data value two pointers: next and previous where the next node contains the address to the next node in the linked list and the previous node contains the address to the previous node in the chained linked list.
A doubly linked has the following –
- Data value
- Next Pointer
- Previous Pointer
Each unit of the above is called a node.
The start of Linked List is denoted by a special additional pointer called head.
Some versions of doubly-linked lists may also have trail pointer that denotes the end of the linked list.
Structure of a Node in Doubly Linked List
struct Node{ int data; struct Node *next; struct Node *prev; };
class Node { public: int data; Node *next; Node *prev; };
Operations
We can do delete and insertion operations on the doubly linked list at various positions which are –
- At beginning
- At the end
- In the middle
Let us now look at the programs for the same. First with insertion operations.
Doubly Linked List Insertion in C++
#include<iostream> using namespace std; class Node { public: int data; Node *next; Node *prev; }; void insertStart (Node ** head, int data) { Node *new_node = new Node (); new_node->data = data; new_node->next = *head; new_node->prev = NULL; // if DLL had already >=1 nodes if (*head != NULL) (*head)->prev = new_node; // changing head to this *head = new_node; } void insertLast (Node ** head, int data) { Node *new_node = new Node (); // assign data // since this will be the last node its next will be NULL new_node->data = data; new_node->next = NULL; //if we are entering the first node if (*head == NULL) { *head = new_node; new_node->prev = NULL; return; } struct Node *last = *head; // traverse to the current last node while (last->next != NULL) last = last->next; // assign current last node's next to this new node // also assign new node's prev to this 'last' node last->next = new_node; new_node->prev = last; // new_node becomes the last node now } int countItems (Node * node) { int count = 0; while (node != NULL) { node = node->next; count++; } return count; } void insertAfter (int n, int data, Node ** head) { int len = countItems (*head); // if insertion position is 0 means entering at start if (n == 0) { insertStart (head, data); return; } // means inserting after last item if (n == len) { insertLast (head, data); return; } // else insertion will happen somewhere in the middle if (n < 1 || len < n) cout << "Invalid position" << endl; else { Node *new_node = new Node (); new_node->data = data; new_node->next = NULL; new_node->prev = NULL; // nthNode used to traverse the Linked List struct Node *nthNode = *head; // traverse till the nth node while (--n) { nthNode = nthNode->next; } struct Node *nextNode = nthNode->next; // (n+1)th node // assigning (n+1)th node's previous to this new node nextNode->prev = new_node; // new_node's next assigned to (n+1)th node new_node->next = nextNode; // new_node's previous assigned to nth node new_node->prev = nthNode; // assign nth node's next to new_node nthNode->next = new_node; } } void display (Node * node) { Node *end = NULL; cout << "Reading DLL Forward: "; while (node != NULL) { cout << node->data << " "; end = node; node = node->next; } cout << "\nReading DLL Backward: "; while (end != NULL) { cout << end->data << " "; end = end->prev; } cout << "\n\n"; } int main () { Node *head = NULL; insertStart (&head, 6); insertStart (&head, 4); insertStart (&head, 2); display (head); insertLast (&head, 8); insertLast (&head, 12); insertLast (&head, 14); display (head); //Inserts after 4th position insertAfter (4, 10, &head); display (head); return 0; }
Output
Reading DLL Forward: 2 4 6 Reading DLL Backward: 6 4 2 Reading DLL Forward: 2 4 6 8 12 14 Reading DLL Backward: 14 12 8 6 4 2 Reading DLL Forward: 2 4 6 8 10 12 14 Reading DLL Backward: 14 12 10 8 6 4 2
#include<iostream> using namespace std; class Node { public: int data; Node *next, *prev; }; class DoublyLinkedList { private: Node * head; public: DoublyLinkedList () { // constructor head = NULL; } int countItems (); void insertStart (int data); void insertLast (int data); void insertAfter (int pos, int data); void display (); }; void DoublyLinkedList::insertStart (int data) { Node *new_node = new Node (); new_node->data = data; new_node->next = head; new_node->prev = NULL; // if DLL had already >=1 nodes if (head != NULL) head->prev = new_node; // changing head to this head = new_node; } void DoublyLinkedList::insertLast (int data) { Node *new_node = new Node (); // assign data // since this will be the last node its next will be NULL new_node->data = data; new_node->next = NULL; //if we are entering the first node if (head == NULL) { head = new_node; new_node->prev = NULL; return; } Node *last = head; // traverse to the current last node while (last->next != NULL) last = last->next; // assign current last node's next to this new node last->next = new_node; new_node->prev = last; // new_node becomes the last node now } void DoublyLinkedList::insertAfter (int n, int data) { int len = countItems (); // if insertion position is 0 means entering at start if (n == 0) { insertStart (data); return; } // means inserting after last item if (n == len) { insertLast (data); return; } // else insertion will happen somewhere in the middle if (n < 1 || len < n) cout << "Invalid position" << endl; else { Node *new_node = new Node (); new_node->data = data; new_node->next = NULL; new_node->prev = NULL; // nthNode used to traverse the Linked List Node *nthNode = head; // traverse till the nth node while (--n) { nthNode = nthNode->next; } Node *nextNode = nthNode->next; // (n+1)th node // assigning (n+1)th node's previous to this new node nextNode->prev = new_node; // new_node's next assigned to (n+1)th node new_node->next = nextNode; // new_node's previous assigned to nth node new_node->prev = nthNode; // assign nth node's next to new_node nthNode->next = new_node; } } int DoublyLinkedList::countItems () { Node *node = new Node (); node = head; int items = 0; while (node != NULL) { node = node->next; items++; } return items; } void DoublyLinkedList::display () { Node *node = head; Node *end = NULL; cout << "Reading DLL Forward: "; while (node != NULL) { cout << node->data << " "; end = node; node = node->next; } cout << "\nReading DLL Backward: "; while (end != NULL) { cout << end->data << " "; end = end->prev; } cout << "\n\n"; } int main () { DoublyLinkedList *dll = new DoublyLinkedList (); dll->insertStart (6); dll->insertStart (4); dll->insertStart (2); dll->display (); dll->insertLast (8); dll->insertLast (12); dll->insertLast (14); dll->display (); // delete 3rd node dll->insertAfter (3, 10); dll->display (); return 0; }
Output
Reading DLL Forward: 2 4 6 Reading DLL Backward: 6 4 2 Reading DLL Forward: 2 4 6 8 12 14 Reading DLL Backward: 14 12 8 6 4 2 Reading DLL Forward: 2 4 6 10 8 12 14 Reading DLL Backward: 14 12 8 10 6 4 2
Doubly Linked List deletion in C++
Let us look at all variations of the program for the same –
#include<iostream> #include<stdlib.h> using namespace std; struct Node { int data; struct Node *next; struct Node *prev; }; int countItems (struct Node *node); void insert (struct Node **head, int data) { struct Node *new_node = (struct Node *) malloc (sizeof (struct Node)); new_node->data = data; new_node->next = *head; new_node->prev = NULL; // If the linked list already had atleast 1 node if (*head != NULL) (*head)->prev = new_node; // new_node will become head *head = new_node; } void deleteStart (struct Node **head) { struct Node *temp = *head; // if DLL is empty if (*head == NULL) { cout << "Linked List Empty, nothing to delete\n"; return; } // if Linked List has only 1 node if (temp->next == NULL) { cout << temp->data << " deleted\n"; *head = NULL; return; } // move head to next node *head = (*head)->next; // assign head node's previous to NULL (*head)->prev = NULL; cout << temp->data << " deleted\n"; free (temp); } void deleteLast (struct Node **head) { struct Node *temp = *head; // if DLL is empty if (*head == NULL) { cout << ("DLL empty can't delete\n"); return; } // if Linked List has only 1 node if (temp->next == NULL) { cout << temp->data << " deleted\n"; *head = NULL; return; } // else traverse to the last node while (temp->next != NULL) temp = temp->next; struct Node *secondLast = temp->prev; // Curr assign 2nd last node's next to Null secondLast->next = NULL; cout << temp->data << " deleted\n"; free (temp); } void deleteNthNode (struct Node **head, int n) { //if the head node itself needs to be deleted int len = countItems (*head); // not valid if (n < 1 || n > len) { cout << "Not a valid position\n"; return; } // delete the first node if (n == 1) { deleteStart (head); return; } if (n == len) { deleteLast (head); return; } struct Node *temp = *head; // traverse to the nth node while (--n) { temp = temp->next; } struct Node *previousNode = temp->prev; // (n-1)th node struct Node *nextNode = temp->next; // (n+1)th node // assigning (n-1)th node's next pointer to (n+1)th node previousNode->next = temp->next; // assigning (n+1)th node's previous pointer to (n-1)th node nextNode->prev = temp->prev; // deleting nth node cout << temp->data << " deleted\n"; free (temp); } // required for deleteNthNode int countItems (struct Node *node) { int items = 0; while (node != NULL) { node = node->next; items++; } return items; } //function to print the doubly linked list void display (struct Node *node) { struct Node *end = NULL; cout << "Reading DLL Forward: "; while (node != NULL) { cout << node->data << " "; end = node; node = node->next; } cout << "\nReading DLL Backward: "; while (end != NULL) { cout << end->data << " "; end = end->prev; } cout << "\n\n"; } int main () { struct Node *head = NULL; insert (&head, 2); insert (&head, 4); insert (&head, 8); insert (&head, 10); insert (&head, 12); insert (&head, 14); display (head); deleteStart (&head); display (head); deleteLast (&head); display (head); // delete 3rd node deleteNthNode (&head, 3); display (head); // delete 1st node deleteNthNode (&head, 1); display (head); // delete 1st node deleteLast (&head); display (head); // delete 1st node deleteStart (&head); display (head); return 0; }
Output
Reading DLL Forward: 14 12 10 8 4 2 Reading DLL Backward: 2 4 8 10 12 14 14 deleted Reading DLL Forward: 12 10 8 4 2 Reading DLL Backward: 2 4 8 10 12 2 deleted Reading DLL Forward: 12 10 8 4 Reading DLL Backward: 4 8 10 12 8 deleted Reading DLL Forward: 12 10 4 Reading DLL Backward: 4 10 12 12 deleted Reading DLL Forward: 10 4 Reading DLL Backward: 4 10 4 deleted Reading DLL Forward: 10 Reading DLL Backward: 10 10 deleted Reading DLL Forward: Reading DLL Backward:
#include<iostream> using namespace std; class Node { public: int data; Node *next, *prev; }; class DoublyLinkedList { private: Node * head; public: DoublyLinkedList () { // constructor head = NULL; } int countItems (); void insert (int data); void deleteStart (); void deleteLast (); void deleteNthNode (int pos); void display (); }; void DoublyLinkedList::insert (int data) { Node *new_node = new Node (); new_node->data = data; new_node->next = head; new_node->prev = NULL; // if DLL had already >=1 nodes if (head != NULL) head->prev = new_node; // changing head to this head = new_node; } void DoublyLinkedList::deleteStart () { Node *temp = head; // if DLL is empty if (head == NULL) { cout << "Linked List Empty, nothing to delete\n"; return; } // if Linked List has only 1 node if (temp->next == NULL) { cout << temp->data << " deleted\n"; head = NULL; return; } // move head to next node head = head->next; // assign head node's previous to NULL head->prev = NULL; cout << temp->data << " deleted\n"; free (temp); } void DoublyLinkedList::deleteLast () { Node *temp = head; // if DLL is empty if (head == NULL) { cout << ("DLL empty can't delete\n"); return; } // if Linked List has only 1 node if (temp->next == NULL) { cout << temp->data << " deleted\n"; head = NULL; return; } // else traverse to the last node while (temp->next != NULL) temp = temp->next; Node *secondLast = temp->prev; // Curr assign 2nd last node's next to Null secondLast->next = NULL; cout << temp->data << " deleted\n"; free (temp); } void DoublyLinkedList::deleteNthNode (int n) { //if the head node itself needs to be deleted int len = countItems (); // not valid if (n < 1 || n > len) { cout << "Not a valid position\n"; return; } // delete the first node if (n == 1) { deleteStart (); return; } if (n == len) { deleteLast (); return; } Node *temp = head; // traverse to the nth node while (--n) { temp = temp->next; } Node *previousNode = temp->prev; // (n-1)th node Node *nextNode = temp->next; // (n+1)th node // assigning (n-1)th node's next pointer to (n+1)th node previousNode->next = temp->next; // assigning (n+1)th node's previous pointer to (n-1)th node nextNode->prev = temp->prev; // deleting nth node cout << temp->data << " deleted\n"; free (temp); } int DoublyLinkedList::countItems () { Node *node = new Node (); node = head; int items = 0; while (node != NULL) { node = node->next; items++; } return items; } void DoublyLinkedList::display () { Node *node = head; Node *end = NULL; cout << "Reading DLL Forward: "; while (node != NULL) { cout << node->data << " "; end = node; node = node->next; } cout << "\nReading DLL Backward: "; while (end != NULL) { cout << end->data << " "; end = end->prev; } cout << "\n\n"; } int main () { DoublyLinkedList *dll = new DoublyLinkedList (); dll->insert (2); dll->insert (4); dll->insert (8); dll->insert (10); dll->insert (12); dll->insert (14); dll->display (); dll->deleteStart (); dll->display (); dll->deleteLast (); dll->display (); // delete 3rd node dll->deleteNthNode (3); dll->display (); // delete 1st node dll->deleteNthNode (1); dll->display (); // delete 1st node dll->deleteLast (); dll->display (); // delete 1st node dll->deleteStart (); dll->display (); return 0; }
Output
Reading DLL Forward: 14 12 10 8 4 2 Reading DLL Backward: 2 4 8 10 12 14 14 deleted Reading DLL Forward: 12 10 8 4 2 Reading DLL Backward: 2 4 8 10 12 2 deleted Reading DLL Forward: 12 10 8 4 Reading DLL Backward: 4 8 10 12 8 deleted Reading DLL Forward: 12 10 4 Reading DLL Backward: 4 10 12 12 deleted Reading DLL Forward: 10 4 Reading DLL Backward: 4 10 4 deleted Reading DLL Forward: 10 Reading DLL Backward: 10 10 deleted Reading DLL Forward: Reading DLL Backward:
Prime Course Trailer
Related Banners
Get PrepInsta Prime & get Access to all 200+ courses offered by PrepInsta in One Subscription
Get over 200+ course One Subscription
Courses like AI/ML, Cloud Computing, Ethical Hacking, C, C++, Java, Python, DSA (All Languages), Competitive Coding (All Languages), TCS, Infosys, Wipro, Amazon, DBMS, SQL and others
Doubly Linked List
- Introduction to Doubly Linked list in Data Structure
Click Here - Doubly Linked List in –
- Insertion in doubly linked list –
- Insertion at beginning in doubly linked list –
- Insertion at end in doubly linked list –
- Insertion at nth node in doubly linked list –
- Deletion in doubly linked list –
- Deletion from beginning in doubly linked list :
- Deletion from nth in doubly linked list :
- Deletion from end in doubly linked list :
- Insertion and Deletion in a doubly linked list :
- Insertion in the middle in a doubly linked list :
Doubly Linked List
- Introduction to Doubly Linked list in Data Structure
- Doubly Linked List in – C | C++ | Java
- Insertion in doubly linked list – C | C++ | Java
- Deletion in doubly linked list – C | C++ | Java
- Insertion and Deletion in doubly linked list – C | C++ | Java
- Insertion in the middle in a doubly linked list – C | C++ | Java
Login/Signup to comment