From a3d841e1ffbd319bb9c31d3c5bf9318de23ea7c1 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 11:44:36 +0530 Subject: [PATCH 1/7] update: added tail of LL --- src/_DataStructures_/LinkedList/index.js | 36 +++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/_DataStructures_/LinkedList/index.js b/src/_DataStructures_/LinkedList/index.js index 1704c3c4..62a85b3c 100644 --- a/src/_DataStructures_/LinkedList/index.js +++ b/src/_DataStructures_/LinkedList/index.js @@ -2,36 +2,42 @@ class Node { constructor(data, next) { this.data = data; this.next = next; + this.length = 0; } } class LinkedList { constructor() { this.head = null; + this.tail = null; } addAtBeginning(element) { this.head = new Node(element, this.head); + if (!this.tail) { + this.tail = this.head; + } + return this.head; } addAtEnd(element) { - const node = new Node(element, null); - if (!this.head) { - this.head = node; - } else { - let address = this.head; - while (address.next) { - address = address.next; - } - address.next = node; + return this.addAtBeginning(element); } + const node = new Node(element, null); + this.tail.next = node; + this.tail = node; + return node; } removeFromBeginning() { if (!this.head) { + this.tail = null; return null; } + if (this.head.next === null) { + this.tail = this.head; + } const node = this.head; this.head = this.head.next; return node; @@ -47,8 +53,10 @@ class LinkedList { address = address.next; } - const node = address.next; - address.next = null; + this.tail = address; + + const node = this.tail.next; + this.tail.next = null; return node; } @@ -63,11 +71,7 @@ class LinkedList { if (!this.head) { return null; } - let address = this.head; - while (address.next) { - address = address.next; - } - return address; + return this.tail; } getAt(index) { From 63ac6320f1d201e009c32e87e0efd6b94fba93f5 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 11:52:18 +0530 Subject: [PATCH 2/7] update: size property aded --- src/_DataStructures_/LinkedList/index.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/_DataStructures_/LinkedList/index.js b/src/_DataStructures_/LinkedList/index.js index 62a85b3c..fd1ed9c2 100644 --- a/src/_DataStructures_/LinkedList/index.js +++ b/src/_DataStructures_/LinkedList/index.js @@ -2,7 +2,6 @@ class Node { constructor(data, next) { this.data = data; this.next = next; - this.length = 0; } } @@ -10,6 +9,7 @@ class LinkedList { constructor() { this.head = null; this.tail = null; + this.size = 0; } addAtBeginning(element) { @@ -17,6 +17,7 @@ class LinkedList { if (!this.tail) { this.tail = this.head; } + this.size += 1; return this.head; } @@ -27,12 +28,12 @@ class LinkedList { const node = new Node(element, null); this.tail.next = node; this.tail = node; + this.size += 1; return node; } removeFromBeginning() { if (!this.head) { - this.tail = null; return null; } if (this.head.next === null) { @@ -40,6 +41,7 @@ class LinkedList { } const node = this.head; this.head = this.head.next; + this.size -= 1; return node; } @@ -57,6 +59,7 @@ class LinkedList { const node = this.tail.next; this.tail.next = null; + this.size -= 1; return node; } @@ -108,8 +111,10 @@ class LinkedList { count -= 1; } - previous.next = new Node(element, previous.next); - return null; + const node = new Node(element, previous.next); + previous.next = node; + this.size += 1; + return node; } removeAt(index) { @@ -133,21 +138,18 @@ class LinkedList { const node = address; previous.next = address.next.next; + this.size -= 1; return node; } length() { - let address = this.head; - let count = 0; - while (address) { - count += 1; - address = address.next; - } - return count; + return this.size; } delete() { this.head = null; + this.tail = this.head; + this.size = 0; } } From cbe4a1eb7e025c1c4797fbfa61a6bac4ba0c7bf9 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 13:21:39 +0530 Subject: [PATCH 3/7] update: implemented Queue using SLL --- src/_DataStructures_/Queue/QueueUsingArray.js | 20 +++++++ src/_DataStructures_/Queue/index.js | 55 ++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 src/_DataStructures_/Queue/QueueUsingArray.js diff --git a/src/_DataStructures_/Queue/QueueUsingArray.js b/src/_DataStructures_/Queue/QueueUsingArray.js new file mode 100644 index 00000000..99d1861c --- /dev/null +++ b/src/_DataStructures_/Queue/QueueUsingArray.js @@ -0,0 +1,20 @@ +class Queue { + constructor() { + this.data = []; + } + + add(element) { + // add element to the start of the data + return this.data.unshift(element); + } + + peek() { + return this.data[this.data.length - 1]; + } + + remove() { + return this.data.pop(); + } +} + +module.exports = Queue; diff --git a/src/_DataStructures_/Queue/index.js b/src/_DataStructures_/Queue/index.js index d51bcab0..641724f1 100644 --- a/src/_DataStructures_/Queue/index.js +++ b/src/_DataStructures_/Queue/index.js @@ -1,20 +1,57 @@ -class Queue { +const { LinkedList: SinglyLinkedLists, Node } = require('../LinkedList'); + +class Queue extends SinglyLinkedLists { constructor() { - this.data = []; + super(); + this.NotAllowed = 'Not Allowed'; + } + + enqueue(data) { + const node = new Node(data, null); + return this.addAtEnd(node); } - add(element) { - // add element to the start of the data - return this.data.unshift(element); + dequeue() { + const node = this.removeFromBeginning(); + return node.data; } peek() { - return this.data[this.data.length - 1]; + return this.getLast(); + } + + size() { + return this.length(); + } + + destroy() { + this.delete(); + } + + /** Override and throw error for other LL methods */ + addAtBeginning() { + throw new Error(this.NotAllowed); + } + + addAt() { + throw new Error(this.NotAllowed); + } + + removeFromEnd() { + throw new Error(this.NotAllowed); + } + + getFirst() { + throw new Error(this.NotAllowed); + } + + getAt() { + throw new Error(this.NotAllowed); } - remove() { - return this.data.pop(); + removeAt() { + throw new Error(this.NotAllowed); } } -module.exports = Queue; \ No newline at end of file +module.exports = Queue; From cc29c56d81137123e41ade2ceb49029874323331 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 13:24:05 +0530 Subject: [PATCH 4/7] fix: peek() should show the front item of queue --- src/_DataStructures_/Queue/Queue.test.js | 21 +++++++++++---------- src/_DataStructures_/Queue/index.js | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/_DataStructures_/Queue/Queue.test.js b/src/_DataStructures_/Queue/Queue.test.js index ebe7205c..bca8210f 100644 --- a/src/_DataStructures_/Queue/Queue.test.js +++ b/src/_DataStructures_/Queue/Queue.test.js @@ -12,23 +12,24 @@ describe('Data Structure : Queue', () => { queue = new Queue(); }); - it('Should add() element to a queue', () => { - queue.add(5); - expect(queue.data).toEqual([5]); + it('Should enqueue() element to a queue', () => { + queue.enqueue(5); + expect(queue.peek()).toEqual([5]); }); - it('Should remove() an element from the queue', () => { - queue.add(2); - queue.add(3); + it('Should dequeue() an element from the queue', () => { + queue.enqueue(2); + queue.enqueue(3); - expect(queue.remove()).toEqual(2); - expect(queue.data).toEqual([3]); + expect(queue.dequeue()).toEqual(2); + expect(queue.peek()).toEqual(3); + expect(queue.size()).toEqual(1); }); describe('peek()', () => { beforeEach(() => { - queue.add(2); - queue.add(5); + queue.enqueue(2); + queue.enqueue(5); }); it('Should return the elemet to be removed using peek()', () => { diff --git a/src/_DataStructures_/Queue/index.js b/src/_DataStructures_/Queue/index.js index 641724f1..01c04de8 100644 --- a/src/_DataStructures_/Queue/index.js +++ b/src/_DataStructures_/Queue/index.js @@ -17,7 +17,7 @@ class Queue extends SinglyLinkedLists { } peek() { - return this.getLast(); + return this.getFirst(); } size() { @@ -41,7 +41,7 @@ class Queue extends SinglyLinkedLists { throw new Error(this.NotAllowed); } - getFirst() { + getLast() { throw new Error(this.NotAllowed); } From 515f4234bf9435949cf427578561b3956dfd0500 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 13:40:23 +0530 Subject: [PATCH 5/7] fix: change in Queue APIs --- src/_DataStructures_/LinkedList/index.js | 11 +++++++--- src/_DataStructures_/Queue/Queue.test.js | 26 ++++++++++++------------ src/_DataStructures_/Queue/index.js | 19 ++++++++++++----- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/_DataStructures_/LinkedList/index.js b/src/_DataStructures_/LinkedList/index.js index fd1ed9c2..e7964c01 100644 --- a/src/_DataStructures_/LinkedList/index.js +++ b/src/_DataStructures_/LinkedList/index.js @@ -22,13 +22,16 @@ class LinkedList { } addAtEnd(element) { + const node = new Node(element, null); + this.size += 1; + if (!this.head) { - return this.addAtBeginning(element); + this.head = node; + this.tail = node; + return node; } - const node = new Node(element, null); this.tail.next = node; this.tail = node; - this.size += 1; return node; } @@ -42,6 +45,7 @@ class LinkedList { const node = this.head; this.head = this.head.next; this.size -= 1; + node.next = null; return node; } @@ -139,6 +143,7 @@ class LinkedList { const node = address; previous.next = address.next.next; this.size -= 1; + node.next = null; return node; } diff --git a/src/_DataStructures_/Queue/Queue.test.js b/src/_DataStructures_/Queue/Queue.test.js index bca8210f..bdbc6f26 100644 --- a/src/_DataStructures_/Queue/Queue.test.js +++ b/src/_DataStructures_/Queue/Queue.test.js @@ -12,9 +12,9 @@ describe('Data Structure : Queue', () => { queue = new Queue(); }); - it('Should enqueue() element to a queue', () => { + it('Should add element to a queue', () => { queue.enqueue(5); - expect(queue.peek()).toEqual([5]); + expect(queue.peek()).toEqual(5); }); it('Should dequeue() an element from the queue', () => { @@ -23,7 +23,7 @@ describe('Data Structure : Queue', () => { expect(queue.dequeue()).toEqual(2); expect(queue.peek()).toEqual(3); - expect(queue.size()).toEqual(1); + expect(queue.length()).toEqual(1); }); describe('peek()', () => { @@ -38,21 +38,21 @@ describe('Data Structure : Queue', () => { it('Should not remove the element', () => { expect(queue.peek()).toEqual(2); - expect(queue.remove()).toEqual(2); + expect(queue.dequeue()).toEqual(2); }); }); it('Should maintain the order of elements', () => { // first in first out - queue.add(2); - queue.add(1); - queue.add(4); - queue.add(3); - - expect(queue.remove()).toEqual(2); - expect(queue.remove()).toEqual(1); - expect(queue.remove()).toEqual(4); - expect(queue.remove()).toEqual(3); + queue.enqueue(2); + queue.enqueue(1); + queue.enqueue(4); + queue.enqueue(3); + + expect(queue.dequeue()).toEqual(2); + expect(queue.dequeue()).toEqual(1); + expect(queue.dequeue()).toEqual(4); + expect(queue.dequeue()).toEqual(3); }); }); }); diff --git a/src/_DataStructures_/Queue/index.js b/src/_DataStructures_/Queue/index.js index 01c04de8..4e097b16 100644 --- a/src/_DataStructures_/Queue/index.js +++ b/src/_DataStructures_/Queue/index.js @@ -7,8 +7,7 @@ class Queue extends SinglyLinkedLists { } enqueue(data) { - const node = new Node(data, null); - return this.addAtEnd(node); + return this.addAtEnd(data); } dequeue() { @@ -17,11 +16,12 @@ class Queue extends SinglyLinkedLists { } peek() { - return this.getFirst(); + const node = this.getFirst(); + return node.data; } - size() { - return this.length(); + length() { + return this.size; } destroy() { @@ -54,4 +54,13 @@ class Queue extends SinglyLinkedLists { } } +const q = new Queue(); + +q.enqueue(10); +q.enqueue(101); +q.enqueue(44); + +console.log(q.length()); +console.log(q.dequeue()); + module.exports = Queue; From aa9e66fb626e05ce9c6de764e4d7ee557d24a8b0 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 13:47:37 +0530 Subject: [PATCH 6/7] fix: change in equality, fix in test case for new Queue API --- src/_DataStructures_/Queue/index.js | 4 ++-- src/_DataStructures_/Queue/weave/index.js | 8 ++++---- .../Queue/weave/weave.test.js | 20 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/_DataStructures_/Queue/index.js b/src/_DataStructures_/Queue/index.js index 4e097b16..acbdfb01 100644 --- a/src/_DataStructures_/Queue/index.js +++ b/src/_DataStructures_/Queue/index.js @@ -12,12 +12,12 @@ class Queue extends SinglyLinkedLists { dequeue() { const node = this.removeFromBeginning(); - return node.data; + return node ? node.data : node; } peek() { const node = this.getFirst(); - return node.data; + return node ? node.data : node; } length() { diff --git a/src/_DataStructures_/Queue/weave/index.js b/src/_DataStructures_/Queue/weave/index.js index 94d1d660..5a6da801 100644 --- a/src/_DataStructures_/Queue/weave/index.js +++ b/src/_DataStructures_/Queue/weave/index.js @@ -4,12 +4,12 @@ function weaveQueues(first, second) { const weaved = new Queue(); while (first.peek() || second.peek()) { - if (first.peek() !== undefined) { - weaved.add(first.remove()); + if (first.peek()) { + weaved.enqueue(first.dequeue()); } - if (second.peek() !== undefined) { - weaved.add(second.remove()); + if (second.peek()) { + weaved.enqueue(second.dequeue()); } } return weaved; diff --git a/src/_DataStructures_/Queue/weave/weave.test.js b/src/_DataStructures_/Queue/weave/weave.test.js index da307f36..05c43ec0 100644 --- a/src/_DataStructures_/Queue/weave/weave.test.js +++ b/src/_DataStructures_/Queue/weave/weave.test.js @@ -10,18 +10,18 @@ describe('Weave two queues using weaveQueues()', () => { const q1 = new Queue(); const q2 = new Queue(); - q1.add('Hello'); - q2.add(1); - q1.add('World'); - q2.add(2); - q2.add(3); + q1.enqueue('Hello'); + q2.enqueue(1); + q1.enqueue('World'); + q2.enqueue(2); + q2.enqueue(3); const q3 = weaveQueues(q1, q2); - expect(q3.remove()).toEqual('Hello'); - expect(q3.remove()).toEqual(1); - expect(q3.remove()).toEqual('World'); - expect(q3.remove()).toEqual(2); - expect(q3.remove()).toEqual(3); + expect(q3.dequeue()).toEqual('Hello'); + expect(q3.dequeue()).toEqual(1); + expect(q3.dequeue()).toEqual('World'); + expect(q3.dequeue()).toEqual(2); + expect(q3.dequeue()).toEqual(3); }); }); From d48713ce85cfc2f314371d0181b36239615116df Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Sun, 13 Oct 2019 13:48:04 +0530 Subject: [PATCH 7/7] cleanup --- src/_DataStructures_/Queue/index.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/_DataStructures_/Queue/index.js b/src/_DataStructures_/Queue/index.js index acbdfb01..9056c130 100644 --- a/src/_DataStructures_/Queue/index.js +++ b/src/_DataStructures_/Queue/index.js @@ -1,4 +1,4 @@ -const { LinkedList: SinglyLinkedLists, Node } = require('../LinkedList'); +const { LinkedList: SinglyLinkedLists } = require('../LinkedList'); class Queue extends SinglyLinkedLists { constructor() { @@ -54,13 +54,4 @@ class Queue extends SinglyLinkedLists { } } -const q = new Queue(); - -q.enqueue(10); -q.enqueue(101); -q.enqueue(44); - -console.log(q.length()); -console.log(q.dequeue()); - module.exports = Queue;