Doubly Link List
Tags: hacktoberfest
Published: 2020-10-15 12:41:17

class Node {

constructor(val) {

    this.val = val;

    this.next = null;

    this.prev = null; 

}
}

class DoublylinkList {

constructor() {

    this.head = null;

    this.tail = null;

    this.length = 0;

}
// 👉👉 Add a new Value to the list

push(val) {

    var newNode = new Node(val);

    if(this.length === 0) {

        this.head = newNode;

        this.tail = newNode;

    } else {

        this.tail.next = newNode;

        newNode.prev = this.tail;

        this.tail = newNode;

    }

    this.length++;

    console.log( ` You are added ${this.length} Node ->> ${val}` );

    return this;

}



// 👉👉 Delete end value in the Node 

pop() {

    if(!this.head) return undefined;

    var poppedNode = this.tail;

    if(this.length === 1) {

        this.head = null;

        this.tail = null;

    } else {

        this.tail = poppedNode.prev;

    }

    this.length--;

    console.log(` Deleted Successfully 👍`)

    return poppedNode;

}



// 👉👉 Delete Head Value in the list

Shift() {

    if(!this.head) return undefined;

    var oldHead = this.head;

    if(this.length === 1) {

        this.head = null;

        this.tail = null;

    } else {

        this.head = oldHead.next;

        this.head.prev = null;

        oldHead.next = null;   

    }

    this.length--;

    return oldHead;

}



// 👉👉 Add value in the head in the list

unShift(val) {

    var newNode = new Node(val);

    if(this.length === 0) {

        this.head = newNode;

        this.tail = newNode;

    } else {

        this.head.prev = newNode

        newNode.next = this.head;

        this.head = newNode;

    }

    this.length++;

    console.log(" -> Added Successfully 👍" );

    return this;

}



// Write a Node number and

// Show this number Node name

get(index) {

    if(index < 0 || index >= this.length) return null;

    if(index <= this.length/2){

        var count = 0;

        var current = this.head;

        while(count != index){

            current = current.next;

            count++;

        }

        return current;

    } else {

        var count = this.length - 1;

        var current = this.tail;

        while(count !== index){

            current = current.next;

            count++;

        }

        return current;

    }

    console.log(" -> Finded Successfully 👍" );

}



// Change the value in the node

set(index, val) {

    var foundNode = this.get(index);

    if(foundNode != null) {

        foundNode.val = val;

        return true;

    }

    return false;

}



// insert Node

insert(index, val) {

    if(index < 0 || index > this.length) return false;

    if(index === 0) return this.unShift(val);

    if(index === this.length) return this.push(val);

    var newNode = new Node(val);

    var beforeNode = this.get(index - 1);

    var afterNode = beforeNode.next;

    beforeNode.next = newNode;

    newNode.prev = beforeNode;

    newNode.next = afterNode;

    afterNode.prev = newNode;

    this.length++;

    return true;

}



// Remove a Node

remove(index) {

    if(index < 0 || index >= this.length) return undefined;

    if(index === 0) return this.Shift()

    if(index === this.length -1) return this.pop();

    var removeNode = this.get(index);

    var beforeNode = removeNode.prev;

    var afterNode = removeNode.next;

    beforeNode.next = afterNode;

    afterNode.prev = beforeNode;

 // removeNode.prev.next = removeNode.next;

 // removeNode.next.next = removeNode.prev;

    removeNode.next = null;

    removeNode.prev = null;

    this.length--;

    return removeNode;

}
}

var list = new DoublylinkList()

list.push("Java")

list.push("Java script")

list.push("Html")

list.push("Css")