Quick actions

cmd+k|ctrl+k

Navigation

Languages

DoublyLinkedList

Snippet info

Language

JavaScript

Visibility

public

Author

vinnysantos559

Created

2019-10-31T02:12:23Z

Updated

2019-10-31T02:18:18Z

class Node {
    constructor(value) {
        this.value = value;
        this.prev = null;
        this.next = null;
    }
}

class LinkedList {
    constructor(value) {
        this.head = new Node(value);
        this.tail = this.head;
        this.length = 1;
    }
    
    printList() {
        const array = [];
        
        let currentNode = this.head;
        while( currentNode !== null ) {
            array.push(currentNode.value);
            currentNode = currentNode.next;
        }
        
        return array;
    }
    
    prepend(value) {
        const newNode = new Node(value);
        newNode.next = this.head;
        this.head.prev = newNode;
        this.head = newNode;
        this.length++;
    }
    
    append(value) {
        const newNode = new Node(value);
        this.tail.next = newNode;
        newNode.prev = this.tail;
        this.tail = newNode;
        this.length++;
    }
    
    insert(value, index) {
        if(index >= this.length) {
            return this.append(value);
        }
        
        const newNode = new Node(value);
        let leader = this._traverseToIndex(index - 1);
        let follower = leader.next;
        leader.next = newNode;
        newNode.prev = leader;
        newNode.next = follower;
        follower.prev = newNode;
        this.length++;
    }
    
    remove(index) {
        if( index >= this.length || index < 0) {
            return 'out of bounds index';
        }
        
        if( index === 0 ) {
            this.head = this.head.next;
        }
        
        else {
            let leader = this._traverseToIndex(index -1);
            let unwantedNode = leader.next;
            if ( unwantedNode ) {
               unwantedNode.next.prev = leader; 
            }
            leader.next = unwantedNode.next;
        }
        this.length--;
    }
    
    _traverseToIndex(index){
        let counter = 0;
        let currentNode = this.head;
        
        while( counter < index ) {
            currentNode = currentNode.next;
            counter++;
        }
        
        return currentNode;
    }
}

const linkedList = new LinkedList(5);
linkedList.prepend(4)
linkedList.append(8);
linkedList.insert(6,3)
linkedList.remove(1);
console.log(linkedList.printList());
console.log(linkedList);
INFO