JavaScriptデータ構造
14128 ワード
定義
リンクリストは、我々がノードを呼ぶ要素のコレクションを表す線形データ構造です.そして、各々のノードが次の1つまたは前のものに指し示すとき、リンクリストの最初のノードは頭です、そして、最後は尾です
リンクリストでは、各ノードは以下のプロパティを持たなければなりません.
Value :ノードの値
next :リンクされたリストの次のノードへのポインタ.
実装
class LinkedList {
constructor() {
this.nodes = [];
}
get size() {
return this.nodes.length;
}
get head() {
return this.size ? this.nodes[0] : null;
}
get tail() {
return this.size ? this.nodes[this.size - 1] : null;
}
insertAt(index, value) {
const previousNode = this.nodes[index - 1] || null;
const nextNode = this.nodes[index] || null;
const node = { value, next: nextNode };
if (previousNode) previousNode.next = node;
// console.log(previousNode);
this.nodes.splice(index, 0, node);
}
insertFirst(value) {
this.insertAt(0, value);
}
insertLast(value) {
this.insertAt(this.size, value);
}
getAt(index) {
return this.nodes[index];
}
removeAt(index) {
const previousNode = this.nodes[index - 1];
const nextNode = this.nodes[index + 1] || null;
if (previousNode) previousNode.next = nextNode;
return this.nodes.splice(index, 1);
}
removeFirst() {
this.removeAt(0)
}
removeLast() {
this.removeAt(this.size - 1)
}
clear() {
this.nodes = [];
}
reverse() {
this.nodes = this.nodes.reduce((acc, {value}) => [{value, next: acc[0]}], [])
}
*[Symbol.iterator]() {
yield* this.nodes;
}
}
const list = new LinkedList();
list.insertFirst(1);
list.insertFirst(2);
list.insertFirst(3);
list.insertLast(4);
list.insertAt(3, 5);
list.size; // 5
list.head.value; // 3
list.head.next.value; // 2
list.tail.value; // 4
[...list.map(e => e.value)]; // [3, 2, 1, 5, 4]
list.removeAt(1); // 2
list.getAt(1).value; // 1
list.head.next.value; // 1
[...list.map(e => e.value)]; // [3, 1, 5, 4]
list.reverse();
[...list.map(e => e.value)]; // [4, 5, 1, 3]
list.clear();
list.size; // 0
Reference
この問題について(JavaScriptデータ構造), 我々は、より多くの情報をここで見つけました https://dev.to/riviergrullon/javascript-datastructure-linked-list-2ocnテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol