diff --git a/DIRECTORY.md b/DIRECTORY.md index ef58990d1..bbdebf098 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -23,13 +23,15 @@ * [MinPriorityQueue](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Heap/MinPriorityQueue.js) * Linked List * [singlylinklist](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Linked%20List/singlylinklist.js) + * [doublylinkedlist](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Linked%20List/doublylinkedlist.js) * Queue * [Queue](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Queue/Queue.js) * Stack * [Stack](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Stack/Stack.js) * Tree * [Binary Search Tree](https://github.com/TheAlgorithms/Javascript/blob/master/Data%20Structures/Tree/Binary%20Search%20Tree.js) - + + ## Hashes * [SHA1](https://github.com/TheAlgorithms/Javascript/blob/master/Hashes/SHA1.js) * [SHA256](https://github.com/TheAlgorithms/Javascript/blob/master/Hashes/SHA256.js) diff --git a/Data Structures/Linked List/DoublyLinkedList.js b/Data Structures/Linked List/DoublyLinkedList.js new file mode 100644 index 000000000..aca5b7eb7 --- /dev/null +++ b/Data Structures/Linked List/DoublyLinkedList.js @@ -0,0 +1,197 @@ +//Hamza chabchoub contribution for a university project +function doubleLinkedList() { + let Node = function(element) { + this.element = element; + this.next = null; + this.prev = null; + } + + let length = 0; + let head = null; + let tail = null; + + //Add new element + this.append = function(element) { + let node = new Node(element); + + if(!head){ + head = node; + tail = node; + }else{ + node.prev = tail; + tail.next = node; + tail = node; + } + + length++; + } + + + //Add element + this.insert = function(position, element) { + + //Check of out-of-bound values + if(position >= 0 && position <= length){ + let node = new Node(element), + current = head, + previous, + index = 0; + + if(position === 0){ + if(!head){ + head = node; + tail = node; + }else{ + node.next = current; + current.prev = node; + head = node; + } + }else if(position === length){ + current = tail; + current.next = node; + node.prev = current; + tail = node; + }else{ + while(index++ < position){ + previous = current; + current = current.next; + } + + node.next = current; + previous.next = node; + + //New + current.prev = node; + node.prev = previous; + } + + length++; + return true; + }else{ + return false; + } + } + + //Remove element at any position + this.removeAt = function(position){ + //look for out-of-bounds value + if(position > -1 && position < length){ + let current = head, previous, index = 0; + + //Removing first item + if(position === 0){ + head = current.next; + + //if there is only one item, update tail //NEW + if(length === 1){ + tail = null; + }else{ + head.prev = null; + } + }else if(position === length - 1){ + current = tail; + tail = current.prev; + tail.next = null; + }else{ + while(index++ < position){ + previous = current; + current = current.next; + } + + //link previous with current's next - skip it + previous.next = current.next; + current.next.prev = previous; + } + + length--; + return current.element; + }else{ + return null; + } + } + + //Get the indexOf item + this.indexOf = function(elm){ + let current = head, + index = -1; + + //If element found then return its position + while(current){ + if(elm === current.element){ + return ++index; + } + + index++; + current = current.next; + } + + //Else return -1 + return -1; + }; + + //Find the item in the list + this.isPresent = (elm) => { + return this.indexOf(elm) !== -1; + }; + + //Delete an item from the list + this.delete = (elm) => { + return this.removeAt(this.indexOf(elm)); + }; + + //Delete first item from the list + this.deleteHead = function(){ + this.removeAt(0); + } + + //Delete last item from the list + this.deleteTail = function(){ + this.removeAt(length-1); + } + + //Print item of the string + this.toString = function(){ + let current = head, + string = ''; + + while(current){ + string += current.element + (current.next ? '\n' : ''); + current = current.next; + } + + return string; + }; + + //Convert list to array + this.toArray = function(){ + let arr = [], + current = head; + + while(current){ + arr.push(current.element); + current = current.next; + } + + return arr; + }; + + //Check if list is empty + this.isEmpty = function(){ + return length === 0; + }; + + //Get the size of the list + this.size = function(){ + return length; + } + + //Get the head + this.getHead = function() { + return head; + } + + //Get the tail + this.getTail = function() { + return tail; + } + } \ No newline at end of file