[TIL] linked list
25134 ワード
linked list
各ノードには、データと次のノードへのリンクとデータがあります.
配列とチェーンテーブルの違い
Array
array[4]
このように)Linked list
チェーンテーブルのタイプ
JSで実現
list node
class ListNode {
constructor(data) {
this.data = data;
this.next = null;
}
}
前に示したように、1つのノードには、次のノードへのポインタとデータがあります.linked list
headが通過しない場合、headはnullに初期化されます.
class LinkedList {
constructor(head = null) {
this.head = head;
this.size = 0;
}
}
せつぞく
let node1 = new ListNode(2);
let node2 = new ListNode(5);
node1.next = node2; // node1의 포인터가 node2를 가리킴
そして次のようにLinkedListに接続します.let list = new LinkedList(node1);
コンソールで確認します.以下のようにします.LinkedList {
head: ListNode { data: 2, next: ListNode { data: 5, next: null } }
}
LinkedListでのメソッド
上記のようにいちいち接続する必要はなく、付加的な機能を持つメソッドを作成すれば、簡単に作成して接続することができます.
class ListNode {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor(head = null) {
this.head = head;
this.size = 0;
}
getSize() {
return this.size;
}
clear() {
this.head = null;
}
add(data) {
let node = new ListNode(data);
let current;
if (this.head == null) {
this.head = node;
} else {
current = this.head;
// 마지막 node로 이동
while (current.next) {
current = current.next;
}
// add node
current.next = node;
}
this.size++;
}
getLast() {
let lastNode = this.head;
while (lastNode.next) {
lastNode = lastNode.next;
}
return lastNode;
}
getfirst() {
return this.head;
}
remove(element) {
let currentNode = this.head;
let prevNode;
if (currentNode.data === element) {
this.head = currentNode.next;
} else {
while (currentNode.data !== element) {
prevNode = currentNode;
currentNode = currentNode.next;
}
prevNode.next = currentNode.next;
}
}
indexOf(element) {
let currentNode = this.head;
let index = -1;
while (currentNode) {
index++;
if (currentNode.data === element) {
return index;
}
currentNode = currentNode.next;
}
return -1;
}
elementAt(index) {
let currentNode = this.head;
let count = 0;
while (count < index) {
count++;
currentNode = currentNode.next;
}
return currentNode.data;
}
addAt(index, element) {
let node = new ListNode(element);
let currentNode = this.head;
let previousNode;
let currentIndex = 0;
if (index > this.size) {
return false;
}
if (index === 0) {
node.next = currentNode;
this.head = node;
} else {
while (currentIndex < index) {
currentIndex++;
previousNode = currentNode;
currentNode = currentNode.next;
}
node.next = currentNode;
previousNode.next = node;
}
this.size++;
}
removeAt(index) {
let currentNode = this.head;
let previousNode;
let currentIndex = 0;
if (index < 0 || index >= this.size) {
return null;
}
if (index === 0) {
head = currentNode.next;
} else {
while (currentIndex < index) {
currentIndex++;
previousNode = currentNode;
currentNode = currentNode.next;
}
// currentIndex === 삭제할 index 일 때:
previousNode.next = currentNode.next;
}
this.size--;
// 삭제한 데이터
return currentNode.data;
}
}
let list = new LinkedList();
list.add(7);
list.add(8);
list.add(13);
list.remove(8);
list.add(14);
list.add(18);
list.addAt(0, 1);
console.log(list);
console.log(list.removeAt(1));
console.log(list);
備考リンク:プレエンコード合宿室 注2:geeks ForGeeks
Reference
この問題について([TIL] linked list), 我々は、より多くの情報をここで見つけました https://velog.io/@mochapoke/TIL-linked-listテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol