LL 3 - Doubly Linked List

Chetan DattaChetan Datta
3 min read

Construction of Doubly Linked List

public static Node constructDll(int arr[]){
    Node head = new Node(0);
    Node temp = head;
    for (int num: arr){
        Node newNode = new Node(num);

        temp.next = newNode;
        newNode.prev = temp;

        temp = newNode;
    }
    head = head.next;
    head.prev = null;
    return head;
}

Node Class

public class Node {
    public int val;
    public Node prev;
    public Node next;

    public Node(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        String toString = "";

        Node temp = this;

        while(temp!=null){
            toString += "<->"+temp.val;
            temp = temp.next;
        }

        return toString;
    }
}

Deletion

Delete Head

    public static Node deleteHead(Node head){
        if (head==null || head.next==null) return null;
        head = head.next;
        head.prev = null;
        return head;
    }

Delete Tail

public static Node deleteTail(Node head){

    if(head == null) return null;

    Node temp = head;

    while(temp.next!=null){
        temp = temp.next;
    }

    Node prevNode = temp.prev;
    prevNode.next = null;

    return head;
}

Delete kth Node

public static Node deleteKthNode(Node head, int k){
    if (head == null) return null;

    Node temp = head;

    int count = 1;

    while(temp!=null && count!=k){
        temp = temp.next;
        count+=1;
    }

    Node left = temp.prev;
    Node right = temp.next;

    if (left!=null){
        left.next = right;
    }
    else{
        head = right;
    }

    if (right!=null) right.prev = left;

    return head;
}

Delete the given Node

public static void deleteNode(Node node){
    Node left = node.prev;
    Node right = node.next;

    left.next = right;
    if(right!=null) right.prev = left;
}

Insertion (Before Node)

Insert at Head

public static Node insertHead(Node head, int x){
    Node newNode = new Node(x);

    if (head==null) return newNode;

    newNode.next = head;
    head.prev = newNode;

    return newNode;
}

Insert at Tail

public static Node insertTail(Node head, int x){
    Node newNode = new Node(x);

    if (head==null) return newNode;
    Node temp = head;

    while(temp.next!=null){
        temp = temp.next;
    }

    Node left = temp.prev;
    left.next = newNode;
    newNode.prev = left;
    newNode.next = temp;
    temp.prev = newNode;

    return head;
}

Insert at kth Element

public static Node insertKthNode(Node head, int k, int x){

    if (k==1) return insertHead(head, x);

    Node temp = head;

    int count = 1;

    while (temp!=null && count!=k){
        temp = temp.next;
        count+=1;
    }

    Node left = temp.prev;
    Node newNode = new Node(x);
    left.next = newNode;
    newNode.prev = left;
    newNode.next = temp;
    temp.prev = newNode;

    return head;
}

Insert the given Node

We can insert before at any given position by using the following code, except at the head position.

public static void insertBeforeNode(Node node, int x){
    Node left = node.prev;

    Node newNode = new Node(x);
    newNode.prev = left;
    newNode.next = node;

    left.next = newNode;
    node.prev = newNode;
}
0
Subscribe to my newsletter

Read articles from Chetan Datta directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Chetan Datta
Chetan Datta

I'm someone deeply engrossed in the world of software developement, and I find joy in sharing my thoughts and insights on various topics. You can explore my exclusive content here, where I meticulously document all things tech-related that spark my curiosity. Stay connected for my latest discoveries and observations.