Doubly Linked List Tutorial - GeeksforGeeks

27 Dec, 2021
A Doubly Linked List (DLL) contains an extra pointer, typically called the previous pointer, together with the next pointer and data which are there in a singly linked list.  
Below are operations on the given DLL: 
Add a node at the front of DLL: The new node is always added before the head of the given Linked List. And the newly added node becomes the new head of DLL & maintaining a global variable for counting the total number of nodes at that time. Traversal of a Doubly linked listInsertion of a node: This can be done in three ways: At the beginning: The new created node is insert in before the head node and head points to the new node.At the end: The new created node is insert at the end of the list and tail points to the new node.At a given position: Traverse the given DLL to that position(let the node be X) then do the following: Change the next pointer of new Node to the next pointer of Node X.Change the prev pointer of next Node of Node X to the new Node.Change the next pointer of node X to new Node.Change the prev pointer of new Node to the Node X.Deletion of a node: This can be done in three ways: At the beginning: Move head to the next node to delete the node at the beginning and make previous pointer of current head to NULL .At the last: Move tail to the previous node to delete the node at the end and make next pointer of tail node to NULL.At a given position: Let the prev node of Node at position pos be Node X and next node be Node Y, then do the following: Change the next pointer of Node X to Node Y.Change the previous pointer of Node Y to Node X.
Add a node at the front of DLL: The new node is always added before the head of the given Linked List. And the newly added node becomes the new head of DLL & maintaining a global variable for counting the total number of nodes at that time. 
Traversal of a Doubly linked list
Insertion of a node: This can be done in three ways: At the beginning: The new created node is insert in before the head node and head points to the new node.At the end: The new created node is insert at the end of the list and tail points to the new node.At a given position: Traverse the given DLL to that position(let the node be X) then do the following: Change the next pointer of new Node to the next pointer of Node X.Change the prev pointer of next Node of Node X to the new Node.Change the next pointer of node X to new Node.Change the prev pointer of new Node to the Node X.
At the beginning: The new created node is insert in before the head node and head points to the new node.
At the end: The new created node is insert at the end of the list and tail points to the new node.
At a given position: Traverse the given DLL to that position(let the node be X) then do the following: Change the next pointer of new Node to the next pointer of Node X.Change the prev pointer of next Node of Node X to the new Node.Change the next pointer of node X to new Node.Change the prev pointer of new Node to the Node X.
Change the next pointer of new Node to the next pointer of Node X.Change the prev pointer of next Node of Node X to the new Node.Change the next pointer of node X to new Node.Change the prev pointer of new Node to the Node X.
Change the next pointer of new Node to the next pointer of Node X.
Change the prev pointer of next Node of Node X to the new Node.
Change the next pointer of node X to new Node.
Change the prev pointer of new Node to the Node X.
Deletion of a node: This can be done in three ways: At the beginning: Move head to the next node to delete the node at the beginning and make previous pointer of current head to NULL .At the last: Move tail to the previous node to delete the node at the end and make next pointer of tail node to NULL.At a given position: Let the prev node of Node at position pos be Node X and next node be Node Y, then do the following: Change the next pointer of Node X to Node Y.Change the previous pointer of Node Y to Node X.
At the beginning: Move head to the next node to delete the node at the beginning and make previous pointer of current head to NULL .
At the last: Move tail to the previous node to delete the node at the end and make next pointer of tail node to NULL.
At a given position: Let the prev node of Node at position pos be Node X and next node be Node Y, then do the following: Change the next pointer of Node X to Node Y.Change the previous pointer of Node Y to Node X.
Change the next pointer of Node X to Node Y.Change the previous pointer of Node Y to Node X.
Change the next pointer of Node X to Node Y.
Change the previous pointer of Node Y to Node X.
Below is the implementation of all the operations: 
CPP
Python3
// C program to implement all functions// used in Doubly Linked List #include <stdio.h>#include <stdlib.h>int i = 0; // Node for Doubly Linked Listtypedef struct node {    int key;    struct node* prev;    struct node* next; } node; // Head, Tail, first & temp Nodenode* head = NULL;node* first = NULL;node* temp = NULL;node* tail = NULL; // Function to add a node in the// Doubly Linked Listvoid addnode(int k){     // Allocating memory    // to the Node ptr    node* ptr        = (node*)malloc(sizeof(node));     // Assign Key to value k    ptr->key = k;     // Next and prev pointer to NULL    ptr->next = NULL;    ptr->prev = NULL;     // If Linked List is empty    if (head == NULL) {        head = ptr;        first = head;        tail = head;    }     // Else insert at the end of the    // Linked List    else {        temp = ptr;        first->next = temp;        temp->prev = first;        first = temp;        tail = temp;    }     // Increment for number of Nodes    // in the Doubly Linked List    i++;} // Function to traverse the Doubly// Linked Listvoid traverse(){    // Nodes points towards head node    node* ptr = head;     // While pointer is not NULL,    // traverse and print the node    while (ptr != NULL) {         // Print key of the node        printf("%d ", ptr->key);        ptr = ptr->next;    }     printf("\n");} // Function to insert a node at the// beginning of the linked listvoid insertatbegin(int k){     // Allocating memory    // to the Node ptr    node* ptr        = (node*)malloc(sizeof(node));     // Assign Key to value k    ptr->key = k;     // Next and prev pointer to NULL    ptr->next = NULL;    ptr->prev = NULL;     // If head is NULL    if (head == NULL) {        first = ptr;        first = head;        tail = head;    }     // Else insert at beginning and    // change the head to current node    else {        temp = ptr;        temp->next = head;        head->prev = temp;        head = temp;    }    i++;} // Function to insert Node at endvoid insertatend(int k){     // Allocating memory    // to the Node ptr    node* ptr        = (node*)malloc(sizeof(node));     // Assign Key to value k    ptr->key = k;     // Next and prev pointer to NULL    ptr->next = NULL;    ptr->prev = NULL;     // If head is NULL    if (head == NULL) {        first = ptr;        first = head;        tail = head;    }     // Else insert at the end    else {        temp = ptr;        temp->prev = tail;        tail->next = temp;        tail = temp;    }    i++;} // Function to insert Node at any// position posvoid insertatpos(int k, int pos){     // For Invalid Position    if (pos < 1 || pos > i + 1) {        printf("Please enter a"               " valid position\n");    }     // If position is at the front,    // then call insertatbegin()    else if (pos == 1) {        insertatbegin(k);    }     // Position is at length of Linked    // list + 1, then insert at the end    else if (pos == i + 1) {        insertatend(k);    }     // Else traverse till position pos    // and insert the Node    else {        node* src = head;         // Move head pointer to pos        while (pos--) {            src = src->next;        }         // Allocate memory to new Node        node **da, **ba;        node* ptr            = (node*)malloc(                sizeof(node));        ptr->next = NULL;        ptr->prev = NULL;        ptr->key = k;         // Change the previous and next        // pointer of the nodes inserted        // with previous and next node        ba = &src;        da = &(src->prev);        ptr->next = (*ba);        ptr->prev = (*da);        (*da)->next = ptr;        (*ba)->prev = ptr;        i++;    }} // Function to delete node at the// beginning of the listvoid delatbegin(){    // Move head to next and    // decrease length by 1    head = head->next;    i--;} // Function to delete at the end// of the listvoid delatend(){    // Mode tail to the prev and    // decrease length by 1    tail = tail->prev;    tail->next = NULL;    i--;} // Function to delete the node at// a given position posvoid delatpos(int pos){     // If invalid position    if (pos < 1 || pos > i + 1) {        printf("Please enter a"               " valid position\n");    }     // If position is 1, then    // call delatbegin()    else if (pos == 1) {        delatbegin();    }     // If position is at the end, then    // call delatend()    else if (pos == i) {        delatend();    }     // Else traverse till pos, and    // delete the node at pos    else {        // Src node to find which        // node to be deleted        node* src = head;        pos--;         // Traverse node till pos        while (pos--) {            src = src->next;        }         // previous and after node        // of the src node        node **pre, **aft;        pre = &(src->prev);        aft = &(src->next);         // Change the next and prev        // pointer of pre and aft node        (*pre)->next = (*aft);        (*aft)->prev = (*pre);         // Decrease the length of the        // Linked List        i--;    }} // Driver Codeint main(){    // Adding node to the linked List    addnode(2);    addnode(4);    addnode(9);    addnode(1);    addnode(21);    addnode(22);     // To print the linked List    printf("Linked List: ");    traverse();     printf("\n");     // To insert node at the beginning    insertatbegin(1);    printf("Linked List after"           " inserting 1 "           "at beginning: ");    traverse();     // To insert at the end    insertatend(0);    printf("Linked List after "           "inserting 0 at end: ");    traverse();     // To insert Node with    // value 44 after 3rd Node    insertatpos(44, 3);    printf("Linked List after "           "inserting 44 "           "after 3rd Node: ");    traverse();     printf("\n");     // To delete node at the beginning    delatbegin();    printf("Linked List after "           "deleting node "           "at beginning: ");    traverse();     // To delete at the end    delatend();    printf("Linked List after "           "deleting node at end: ");    traverse();     // To delete Node at position 5    printf("Linked List after "           "deleting node "           "at position 5: ");    delatpos(5);    traverse();     return 0;}
# Python3 program to implement all functions# used in Doubly Linked List i = 0 # Node for Doubly Linked Listclass node:    def __init__(self, k=0, p=None, n=None):        self.key = k        self.prev = p        self.next = n  # Head, Tail, first & temp Nodehead = Nonefirst = Nonetemp = Nonetail = None # Function to add a node in the# Doubly Linked Listdef addnode(k: int):    global i, head, first, tail    # Allocating memory    # to the Node ptr    ptr = node(k)     # If Linked List is empty    if head == None:        head = ptr        first = head        tail = head     # Else insert at the end of the    # Linked List    else:        temp = ptr        first.next = temp        temp.prev = first        first = temp        tail = temp     # Increment for number of Nodes    # in the Doubly Linked List    i += 1  # Function to traverse the Doubly# Linked Listdef traverse():    # Nodes points towards head node    ptr = head     # While pointer is not None,    # traverse and print the node    while ptr != None:         # Print key of the node        print(ptr.key, end=" ")        ptr = ptr.next     print()  # Function to insert a node at the# beginning of the linked listdef insertatbegin(k: int):    global head, first, tail, i     # Allocating memory    # to the Node ptr    ptr = node(k)     # If head is None    if head == None:        first = ptr        first = head        tail = head     # Else insert at beginning and    # change the head to current node    else:        temp = ptr        temp.next = head        head.prev = temp        head = temp     i += 1  # Function to insert Node at enddef insertatend(k: int):    global head, first, tail, i     # Allocating memory    # to the Node ptr    ptr = node(k)     # If head is None    if head == None:        first = ptr        first = head        tail = head     # Else insert at the end    else:        temp = ptr        temp.prev = tail        tail.next = temp        tail = temp     i += 1  # Function to insert Node at any# position posdef insertatpos(k: int, pos: int):    global i     # For Invalid Position    if pos < 1 or pos > i + 1:        print("Please enter a" " valid position")     # If position is at the front,    # then call insertatbegin()    elif pos == 1:        insertatbegin(k)     # Position is at length of Linked    # list + 1, then insert at the end    elif pos == i + 1:        insertatend(k)     # Else traverse till position pos    # and insert the Node    else:        src = head         # Move head pointer to pos        while pos:            pos -= 1            src = src.next         # Allocate memory to new Node        ptr = node(k)         # Change the previous and next        # pointer of the nodes inserted        # with previous and next node        ptr.next = src        ptr.prev = src.prev        src.prev.next = ptr        src.prev = ptr        i += 1  # Function to delete node at the# beginning of the listdef delatbegin():    # Move head to next and    # decrease length by 1    global head, i    head = head.next    i -= 1  # Function to delete at the end# of the listdef delatend():    # Mode tail to the prev and    # decrease length by 1    global tail, i    tail = tail.prev    tail.next = None    i -= 1  # Function to delete the node at# a given position posdef delatpos(pos: int):    global i    # If invalid position    if pos < 1 or pos > i + 1:        print("Please enter a" " valid position")     # If position is 1, then    # call delatbegin()    elif pos == 1:        delatbegin()     # If position is at the end, then    # call delatend()    elif pos == i:        delatend()     # Else traverse till pos, and    # delete the node at pos    else:        # Src node to find which        # node to be deleted        src = head        pos -= 1         # Traverse node till pos        while pos:            pos -= 1            src = src.next         # Change the next and prev        # pointer of pre and aft node        src.prev.next = src.next        src.next.prev = src.prev         # Decrease the length of the        # Linked List        i -= 1  # Driver Codeif __name__ == "__main__":    # Adding node to the linked List    addnode(2)    addnode(4)    addnode(9)    addnode(1)    addnode(21)    addnode(22)     # To print the linked List    print("Linked List: ")    traverse()     print("\n")     # To insert node at the beginning    insertatbegin(1)    print("Linked List after inserting 1 at beginning: ")    traverse()     # To insert at the end    insertatend(0)    print("Linked List after inserting 0 at end: ")    traverse()     # To insert Node with    # value 44 after 3rd Node    insertatpos(44, 3)    print("Linked List after inserting 44 after 3rd Node: ")    traverse()     print("\n")     # To delete node at the beginning    delatbegin()    print("Linked List after deleting node at beginning: ")    traverse()     # To delete at the end    delatend()    print("Linked List after deleting node at end: ")    traverse()     # To delete Node at position 5    print("Linked List after deleting node at position 5: ")    delatpos(5)    traverse()
sweetyty
amartyaghoshgfg
doubly linked list
Programming Basics
Algorithms
Linked List
Programming Language
Write From Home
Linked List
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
DSA Sheet by Love Babbar
Difference between Informed and Uninformed Search in AI
SCAN (Elevator) Disk Scheduling Algorithms
Quadratic Probing in Hashing
K means Clustering - Introduction
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Reverse a linked list
Stack Data Structure (Introduction and Program)
Linked List | Set 3 (Deleting a node)