- 자바스크립트로 doublyLinkedList 구현하기
function Node(data) {
this.data = data;
this.next = null;
}
class DoublyLinkedList {
head;
tail;
size = 0;
addFirst(input) {
const temp = new Node(input);
temp.next = this.head;
if (this.head != null) this.head.prev = temp;
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;
temp.prev = this.tail;
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);
newNode.next = temp2;
if (temp2 != null) temp2.prev = newNode;
temp1.next = newNode;
newNode.prev = temp1;
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;
const returnData = temp.data;
if (this.head != null) this.head.prev = null;
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;
}
const todoDeleted = temp.next;
temp.next = temp.next.next;
temp.next.prev = temp;
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,
};
},
hasPrevious: () => {
return nextIndex > 0;
},
previous: () => {
lastReturned = next = next == null ? this.tail : next.prev;
nextIndex--;
return {
done: nextIndex === 0,
value: lastReturned.data,
};
},
};
}
}
const numbers = new DoublyLinkedList();
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);
}
while (it.hasPrevious()) {
const value = it.previous();
console.log(value);
}
console.log(numbers.toString());
numbers.remove(0);
console.log(numbers.toString());
참조