Skip to content

Commit 0100f89

Browse files
committed
singly linked list
1 parent 2195fe8 commit 0100f89

File tree

5 files changed

+357
-29
lines changed

5 files changed

+357
-29
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
class Node {
2+
constructor(val, next = null) {
3+
this.val = val;
4+
this.next = next;
5+
}
6+
}
7+
8+
class LinkedList {
9+
constructor() {
10+
this.head = null;
11+
this.tail = null;
12+
this.length = 0;
13+
}
14+
15+
/**
16+
* @param {number} index
17+
* @return {number}
18+
*/
19+
get(index) {
20+
if (index >= this.length || index < 0) return -1;
21+
if (index === this.length - 1) return this.tail.val;
22+
if (index === 0) return this.head.val;
23+
let curr = this.head;
24+
while (index-- > 0) (curr = curr.next);
25+
return curr.val;
26+
}
27+
28+
insertToEmptyList(val) {
29+
this.head = new Node(val);
30+
this.tail = this.head;
31+
this.length++;
32+
}
33+
34+
rmFromEmptyList(val) {
35+
this.head = null;
36+
this.tail = null;
37+
this.length = 0;
38+
return true;
39+
}
40+
41+
/**
42+
* @param {number} val
43+
* @return {void}
44+
*/
45+
insertHead(val) {
46+
if (!this.length) this.insertToEmptyList(val);
47+
else (this.head = new Node(val, this.head)), this.length++;
48+
}
49+
50+
/**
51+
* @param {number} val
52+
* @return {void}
53+
*/
54+
insertTail(val) {
55+
if (!this.length) this.insertToEmptyList(val);
56+
else
57+
(this.tail.next = new Node(val)),
58+
(this.tail = this.tail.next),
59+
this.length++;
60+
}
61+
62+
removeHead() {
63+
this.head = this.head.next;
64+
this.length--;
65+
return true;
66+
}
67+
68+
removeTail() {
69+
let curr = this.head;
70+
while (curr.next.next) curr = curr.next;
71+
this.tail = curr;
72+
this.tail.next = null;
73+
this.length--;
74+
return true;
75+
}
76+
77+
/**
78+
* @param {number} index
79+
* @return {boolean}
80+
*/
81+
remove(index) {
82+
if (!this.length || index >= this.length) return false;
83+
if (this.length === 1) return this.rmFromEmptyList();
84+
if (index === 0) return this.removeHead();
85+
if (index === this.length - 1) return this.removeTail();
86+
let curr = this.head;
87+
while (index-- > 1) (curr = curr.next);
88+
curr.next = curr.next.next;
89+
this.length--;
90+
return true;
91+
}
92+
93+
/**
94+
* @return {number[]}
95+
*/
96+
getValues() {
97+
let curr = this.head,
98+
values = [];
99+
while (curr) values.push(curr.val), (curr = curr.next);
100+
return values;
101+
}
102+
}
103+
104+
// TESTS
105+
106+
const test = (result, expected) => {
107+
if (result.length !== expected.length) return false;
108+
for (let i = 0; i < result.length; i++)
109+
if (result[i] !== expected[i]) return false;
110+
return true;
111+
};
112+
113+
// ["insertTail", 1, "insertTail", 2, "get", 1, "remove", 1, "insertTail", 2, "get", 1, "get", 0]
114+
// const list = new LinkedList();
115+
// list.insertTail(1);
116+
// list.insertTail(2);
117+
// console.log(test(list.getValues(), [1, 2])); // true
118+
// console.log(list.get(1)); // 2
119+
// console.log(list.remove(1)); // true
120+
// list.insertTail(2);
121+
// console.log(list.get(1)); // 2
122+
// console.log(list.get(0)); // 1
123+
// console.log(test(list.getValues(), [1, 2])); // true
124+
125+
// ["insertHead", 1, "insertHead", 2, "insertTail", 3, "insertTail", 4, "insertHead", 5, "get", 0, "get", 2, "get", 4, "remove", 2, "remove", 0, "insertHead", 6, "insertTail", 7, "getValues", "get", 5]
126+
127+
const list = new LinkedList();
128+
list.insertHead(1);
129+
list.insertHead(2);
130+
list.insertTail(3);
131+
list.insertTail(4);
132+
list.insertHead(5);
133+
console.log(list.get(0)); // 5
134+
console.log(list.get(2)); // 3
135+
console.log(list.get(4)); // 4
136+
console.log(list.remove(2)); // true
137+
console.log(list.remove(0)); // true
138+
list.insertHead(6);
139+
list.insertTail(7);
140+
console.log(list.getValues()); // [6, 1, 3, 4, 7]
141+
console.log(list.get(5)); // 7
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* @param {Object|Array} obj
3+
* @return {Object|Array}
4+
*/
5+
6+
function arrHelper(arr) {
7+
let result = [];
8+
for (let val of arr) {
9+
if (val === null) continue;
10+
if (Array.isArray(val)) result.push(arrHelper(val));
11+
else if (typeof val === 'object') result.push(objHelper(val));
12+
else if (Boolean(val)) result.push(val);
13+
}
14+
return result;
15+
}
16+
17+
function objHelper(obj) {
18+
let result = {};
19+
for (let key of Object.keys(obj)) {
20+
const val = obj[key];
21+
if (val === null) continue;
22+
if (Array.isArray(val)) result[key] = arrHelper(val);
23+
else if (typeof val === 'object') result[key] = objHelper(val);
24+
else if (Boolean(val)) result[key] = val;
25+
}
26+
return result;
27+
}
28+
29+
const compactObject = (arrOrObj) => {
30+
if (Array.isArray(arrOrObj)) return arrHelper(arrOrObj);
31+
if (typeof arrOrObj === 'object') return objHelper(arrOrObj);
32+
};
33+
34+
// TEST
35+
36+
console.log(
37+
compactObject({
38+
a: 1,
39+
b: null,
40+
c: 'hello',
41+
d: false,
42+
e: undefined,
43+
f: 0,
44+
g: 2,
45+
})
46+
); // { a: 1, c: 'hello', g: 2 }

neetcode_practice_150/04-stack/01_valid-parentheses.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,26 @@
22
* @param {string} s
33
* @return {boolean}
44
*/
5-
const isValid = function (s) {
6-
const pairs = { ')': '(', ']': '[', '}': '{' }, stack = [];
7-
for (let c of s)
8-
c in pairs
9-
? stack[stack.length - 1] === pairs[c]
10-
? stack.pop()
11-
: false
12-
: stack.push(c);
13-
return !stack.length;
5+
const isValid = (str) => {
6+
const pairs = {
7+
'(': ')',
8+
'{': '}',
9+
'[': ']',
10+
};
11+
const stack = [];
12+
for (let c of str) {
13+
if (c in pairs) stack.push(c);
14+
else if (pairs[stack[stack.length - 1]] === c) stack.pop();
15+
else return false;
16+
}
17+
18+
return stack.length === 0;
1419
};
1520

1621
// test
1722
console.log(isValid('()')); // true
1823
console.log(isValid('()[]{}')); // true
1924
console.log(isValid('(]')); // false
2025
console.log(isValid('([)]')); // false
26+
console.log(isValid('{[]}')); // true
27+
console.log(isValid('[')); // false

neetcode_practice_150/04-stack/02_min-stack.js

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,41 @@ class MinStack {
44
this.minStack = [];
55
}
66

7+
/**
8+
* @param {number} val
9+
* @return {void}
10+
*/
11+
push(val) {
12+
if (!this.stack.length) this.stack.push(val), this.minStack.push(val);
13+
else {
14+
this.stack.push(val);
15+
if (this.getMin() > val) this.minStack.push(val);
16+
else this.minStack.push(this.getMin());
17+
}
18+
}
19+
20+
/**
21+
* @return {void}
22+
*/
23+
pop() {
24+
if (this.stack.length) this.stack.pop(), this.minStack.pop();
25+
}
26+
27+
/**
28+
* @return {number}
29+
*/
30+
top() {
31+
let len = this.stack.length;
32+
return len ? this.stack[len - 1] : null;
33+
}
34+
35+
/**
36+
* @return {number}
37+
*/
38+
getMin() {
39+
return this.minStack[this.minStack.length - 1];
40+
}
41+
742
print() {
843
console.log('stack:', this.stack.join(', '));
944
console.log('minStack:', this.minStack.join(', '));
@@ -16,24 +51,13 @@ class MinStack {
1651
// [[],[-2],[0],[-3],[],[],[],[]]
1752

1853
const minStack = new MinStack();
19-
// minStack.push(-2);
20-
// minStack.push(0);
21-
// minStack.push(-3);
22-
// minStack.print(); // stack: -2, 0, -3; minStack: -2, -3
23-
// console.log(minStack.getMin()); // -3
24-
// console.log(minStack.pop()); // -3
25-
// console.log(minStack.top()); // 0
26-
// console.log(minStack.getMin()); // -2
27-
// minStack.print(); // stack: -2, 0; minStack: -2
28-
29-
// ["MinStack","push","push","push","getMin","pop","getMin"]
30-
// [[],[0],[1],[0],[],[],[]]
31-
54+
minStack.push(-2);
3255
minStack.push(0);
33-
minStack.push(1);
34-
minStack.push(0);
35-
minStack.print(); // stack: 0, 1, 0; minStack: 0, 0
36-
console.log(minStack.getMin()); // 0
37-
console.log(minStack.pop()); // 0
38-
console.log(minStack.getMin()); // 0
39-
minStack.print(); // stack: 0, 1; minStack: 0
56+
minStack.push(-3);
57+
minStack.print();
58+
console.log(minStack.getMin());
59+
minStack.pop();
60+
minStack.print();
61+
console.log(minStack.top());
62+
console.log(minStack.getMin());
63+

0 commit comments

Comments
 (0)