function Node(data) {
this.data = data;
this.next = null;
}
class LinkedList {
head;
tail;
size = 0;
Node(data) {
this.data = data;
this.next = null;
}
addFirst(input) {
const temp = new Node(input);
temp.next = this.head;
this.head = temp;
this.size++;
if (this.head.next == null) {
this.tail = this.head;
}
}
addLast(input) {
const temp = new Node(input);
if (this.size == 0) {
this.addFirst(input);
} else {
this.tail.next = temp;
this.tail = temp;
this.size++;
}
}
add(k, input) {
if (k == 0) {
this.addFirst(input);
} else {
let temp1 = this.head;
for (let i = 0; i < k - 1; i++) {
temp1 = temp1.next;
}
const temp2 = temp1.next;
const newNode = new Node(input);
temp1.next = newNode;
newNode.next = temp2;
this.size++;
if (newNode.next == null) {
this.tail = newNode;
}
}
}
toString() {
if (this.head == null) {
return '[]';
}
let temp = this.head;
let str = '[';
while (temp.next != null) {
str += temp.data + ',';
temp = temp.next;
}
str += temp.data;
return str + ']';
}
removeFirst() {
const temp = this.head;
this.head = temp.next;
let returnData = temp.data;
this.size--;
return returnData;
}
remove(k) {
if (k == 0) return this.removeFirst();
let temp = this.head;
for (let i = 0; i < k - 1; i++) {
temp = temp.next;
}
let todoDeleted = temp.next;
temp.next = temp.next.next;
const returnData = todoDeleted.data;
if (todoDeleted == this.tail) {
this.tail = temp;
}
this.size--;
return returnData;
}
getSize() {
return this.size;
}
getIndex(k) {
let temp = this.head;
for (let i = 0; i < k; i++) {
temp = temp.next;
}
return temp.data;
}
indexOf(data) {
let temp = this.head;
let index = 0;
while (temp.data != data) {
temp = temp.next;
index++;
if (temp == null) return -1;
}
return index;
}
iterator() {
let lastReturned = null;
let next = this.head;
let nextIndex = 0;
return {
hasNext: () => {
return nextIndex < this.size;
},
next: () => {
lastReturned = next;
next = next.next;
nextIndex++;
return {
done: nextIndex === this.size,
value: lastReturned.data,
};
},
};
}
}
const numbers = new LinkedList();
numbers.addFirst(10);
numbers.addFirst(20);
numbers.addFirst(30);
numbers.addFirst(40);
console.log('add(값)');
console.log(numbers.toString());
numbers.add(1, 50);
console.log('\nadd(인덱스, 값)');
console.log(numbers.toString());
numbers.remove(2);
console.log('\nremove(인덱스)');
console.log(numbers.toString());
console.log('\nget(인덱스)');
console.log(numbers.getIndex(2));
console.log('\nsize()');
console.log(numbers.getSize());
console.log('\nindexOf()');
console.log(numbers.indexOf(30));
console.log(numbers.indexOf(10));
console.log('\nfor loop');
for (let i = 0; i < numbers.getSize(); i++) {
console.log(numbers.getIndex(i));
}
const it = numbers.iterator();
console.log('\niterator');
while (it.hasNext()) {
const value = it.next();
console.log(value);
}
console.log(numbers.toString());
numbers.remove(0);
console.log(numbers.toString());
참조