When I change values of front
and back
inside of frontAndBackExist
function, the changes won't be reflected outside of frontAndBackExist
function. Thus when I call isEmpty
function after adding and removing nodes, it returns false even though there aren't any nodes left. Is this because front
and back
are primitive values?
type DequeNode = {
value: any;
prev?: DequeNode;
next?: DequeNode;
};
type FrontBackTypes = DequeNode | undefined;
function Deque() {
let front: FrontBackTypes = undefined;
let back: FrontBackTypes = undefined;
let cnt = 0;
function addFront(value: any) {
if (!front) {
front = back = { value };
cnt++;
return null;
}
cnt++; // a new node just pushed!
const tempFront = front;
front = { value, prev: tempFront };
tempFront.next = front;
return;
}
function removeFront() {
if (!front) {
return null;
}
const value = peekFront();
if (frontAndBackExist(front, back)) {
front = undefined;
back = undefined;
cnt--;
return value;
}
cnt--;
front = front.prev;
delete front!.next;
return value;
}
function peekFront() {
return front?.value;
}
function addBack(value: any) {
if (!front) {
const backVal = { value };
front = backVal;
back = backVal;
cnt++;
return null;
}
cnt++;
const tempBack = back;
back = { value, next: tempBack };
tempBack!.prev = back;
return;
}
function removeBack() {
if (!back) {
return null;
}
const value = peekBack();
if (frontAndBackExist(front, back)) {
front = undefined;
back = undefined;
cnt--;
return value;
}
cnt--;
back = back.next;
delete back!.prev;
return value;
}
function peekBack() {
return back?.value;
}
function size() {
return cnt;
}
function isEmpty() {
return cnt === 0;
}
function clear() {
front = undefined;
back = undefined;
cnt = 0;
}
function frontAndBackExist(front: FrontBackTypes, back: FrontBackTypes) {
return front === back;
// if (front === back) {
// // if you change front and back value here, it won't be reflected outside of this function. thus the last isEmpty call returns false even though there is no node in deque.
// front = undefined;
// back = undefined;
// return true;
// } else {
// return false;
// }
}
return {
addFront,
removeFront,
peekFront,
addBack,
removeBack,
peekBack,
size,
isEmpty,
clear,
};
}
const deque = Deque();
console.log(deque.peekFront()); // undefined
console.log(deque.isEmpty(), "return if deque is empty or not");
console.log(deque.size(), "return length of deque");
deque.addFront(1);
console.log(deque.peekBack()); // 1
deque.addFront(2);
console.log(deque.size(), "return length of deque");
deque.clear();
console.log(deque.size(), "return length of deque");
console.log(deque.removeBack()); // 1
console.log(deque.isEmpty(), "return if deque is empty or not");
deque.addFront(3);
deque.addFront(4);
console.log(deque.size(), "return length of deque");
console.log(deque.size());
console.log(deque.peekBack()); // 2
deque.addBack(5);
deque.addBack(6);
console.log(deque.peekBack()); // 6
console.log(deque.removeFront()); // 4
console.log(deque.removeFront()); // 3
console.log(deque.removeFront()); // 2
console.log(deque.size(), "return length of deque");
console.log(deque.removeFront()); // 5
console.log(deque.isEmpty(), "return if deque is empty or not");
console.log(deque.removeFront()); // 6
console.log(deque.isEmpty(), "return if deque is empty or not");
console.log(deque.removeFront()); // undefined
console.log(deque.isEmpty(), "return if deque is empty or not");
Change front
and back
values inside helper function but those changes won't be reflected outside of the helper function.