각 노드는 데이터와 다음노드를 가리키는 링크와 데이터를 갖고있다.
array[4]
이런식으로)class ListNode {
constructor(data) {
this.data = data;
this.next = null;
}
}
위와 같이 하나의 노드는 다음노드를 가리키는 포인터와 데이터를 갖고있음
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 } }
}
위와같이 일일이 연결해주지 않아도, 추가하는 기능이 있는 method를 생성하면 손쉽게 생성, 연결할 수 있다.
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);