← Blog

January, 2020

## Intro

Last time, we learned to enqueue a node to the end of the Queue.

Today, we learn how to dequeue / remove a new node from the start of the Queue.

## Starter Code ▶️

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

class Queue {
constructor() {
this.length = 0;
this.start = null;
this.end = null;
}

enqueue(value) {
const newNode = new Node(value);

if (!this.length) {
this.start = newNode;
this.end = newNode;
} else {
this.end.next = newNode;
this.end = newNode;
}

this.length += 1;
return newNode;
}
}``````

## Thoughts 💭

First, we should think about the constraints and possibilities:

If the Queue is empty:

• we can’t remove a node

If the Queue has one node:

• set the current start as the node to remove
• set the node after the start as the new start
• set the next node of the node to remove to null
• set the end to null
• decrease the queue’s length by 1
• return the node to remove

All remaining cases:

• set the current start as the node to remove
• set the node after the start as the new start
• set the next node of the node to remove to null
• decrease the queue’s length by 1
• return the node to remove

Differences:

• we only have to change the end of the queue when we start with one node, because then there is no end left, because the queue will be empty

## Example

``````// current queue:
A (start) ==> B (end)

// desired queue:
B (start, end)``````

Steps:

``````// current queue:
A (start) ==> B (end)

// set the node after the start as the new start
A         ==> B (start, end)

// set the next node of the node to remove to null
A             B (start, end)

// desired queue:
B (start, end)``````

## Implementation 📝

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

class Queue {
constructor() {
this.length = 0;
this.start = null;
this.end = null;
}

enqueue(value) {
const newNode = new Node(value);

if (!this.length) {
this.start = newNode;
this.end = newNode;
} else {
this.end.next = newNode;
this.end = newNode;
}

this.length += 1;
return newNode;
}

dequeue() {
if (!this.length) {
return null;
} else {
// set the current start as the node to remove
const nodeToRemove = this.start;

// set the node after the start as the new start
this.start = this.start.next;

// set the next node of the node to remove to null
nodeToRemove.next = null;

// set the end to null, if the queue will be empty after removing
if (this.length === 1) {
this.end = null;
}

// decrease the queue's length by 1
this.length -= 1;

// return the node to remove
return nodeToRemove;
}
}
}``````

## Result

Let’s have a look how to use the `dequeue` method and its results.

``````const newQueue = new Queue();
newQueue.enqueue("new A");
newQueue.enqueue("new B");

// queue with 2 nodes
console.log(newQueue);
// Queue {
//   length: 2,
//   start: Node { value: 'new A', next: Node { value: 'new B', next: null } },
//   end: Node { value: 'new B', next: null }
// }

// remove the start, "new A"
console.log(newQueue.dequeue());
// Node { value: 'new A', next: null }

// 1 node should be left, "new B"
console.log(newQueue);
// Queue {
//   length: 1,
//   start: Node { value: 'new B', next: null },
//   end: Node { value: 'new B', next: null }
// }

// remove the start, "new B"
console.log(newQueue.dequeue());
// Node { value: 'new B', next: null }

// queue should be empty
console.log(newQueue);
// Queue { length: 0, start: null, end: null }``````

## Next Part ➡️

We will do a small recap of our Queue.

Don’t miss interesting stuff, subscribe!

## Questions ❔

• If we would implement the Queue by using an Array, how would we dequeue the start node? Hi! I'm Michael 👋 I'm a Mentor & Educator & Senior Web Developer - I help you to reach your (career) goals.