Intro
Last time, we learned how to add a new node to the Stack.
Today, we learn how to pop / remove the node on top of the Stack.
Starter Code
We start with the code from the last part.
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class Stack {
constructor() {
this.length = 0;
this.last = null;
}
push(value) {
const newNode = new Node(value);
if (!this.length) {
this.last = newNode;
} else {
newNode.next = this.last;
this.last = newNode;
}
this.length += 1;
return newNode;
}
}
Thoughts
First, we should think about the constraints and possibilities:
If the Stack is empty:
- return null, because we can't remove a node
All remaining cases:
- set the current last node as the node to remove
- set the last node's next node as the new last node
- remove the connection from the node to remove to its next node
- decrease the stack's length by 1
- return the node
Example
// current stack:
A <== B (last)
// desired stack:
A (last)
Steps:
// current stack:
A <== B (last)
// set the last node's next node as the new last node
A (last) <== B
// remove the connection from the node to remove to its next node
A (last)
// desired stack:
A (last)
=> stack after last step equals the desired stack
Implementation
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class Stack {
constructor() {
this.length = 0;
this.last = null;
}
push(value) {
const newNode = new Node(value);
if (!this.length) {
this.last = newNode;
} else {
newNode.next = this.last;
this.last = newNode;
}
this.length += 1;
return newNode;
}
pop() {
// if the Stack is empty, return null, because we can't remove a node
if (!this.length) {
return null;
} else {
// set the current last node as the node to remove
const nodeToRemove = this.last;
// set the last node's next node as the new last node
this.last = nodeToRemove.next;
// remove the connection from the node to remove to its next node
nodeToRemove.next = null;
// decrease the stack's length by 1
this.length -= 1;
// return the node
return nodeToRemove;
}
}
}
Result
Let's have a look how to use the pop
method and its results.
const newStack = new Stack();
newStack.push("A");
newStack.push("B");
// should have two nodes, B at the top of the stack
console.log(newStack);
// Stack {
// length: 2,
// last: Node { value: 'B', next: Node { value: 'A', next: null } }
// }
// remove the top one
console.log(newStack.pop());
// Node { value: 'B', next: null }
// should have one node, A at the top of the stack
console.log(newStack);
// Stack { length: 1, last: Node { value: 'A', next: null } }
// remove the top one
console.log(newStack.pop());
// Node { value: 'A', next: null }
// no node left :C
console.log(newStack);
// Stack { length: 0, last: null }
Next Part
We will do a small recap of our Stack.
If you want to get notified, subscribe!
Top comments (4)
I can proudly say that I understand Singly, Doubly, Stack List behaviour and implementations. Thanks, @miku86
Keep up the good work.
Thank you Joseph,
that's awesome! :-)
There's a typo at the beginning of the post. I see
pop
instead ofpush
in theStarter Code
section.Thanks Joseph,
I fixed it.