3일차 강의는 그동안 코딩테스트를 위해 아무 생각없이 쓰던 API들이 어떤 식으로 이루어지는지 배우는 강의였다. 효율적인 메모리관리와 빠른 동작수행을 위해서 API의 사용방식도 알아야 할 필요를 느꼈다.
그런데 이론만 공부하다가 막상 코딩테스트로 알고리즘을 구현하려 하니, 오랜 시간이 걸릴 뿐더러 몇 시간을 붙잡고 있어도 풀리지가 않는 것들이 있었다...😥
때문에 시간이 없다는 핑계로 자꾸 주말로 미루고 있는데, 과제를 하다보니 더 공부해봐야 할 것들이 생겼다. 주말에 에러와 예외처리에 관해서도 정리해봐야겠다!🤣
class Node { // 노드생성
constructor(value) {
this.value = value; // 노드 데이터영역
this.next = null; // 다음 노드를 가르키는 포인터영역
}
}
class SinglyLinkedList { // 노드를 엮어주는 역할
constuctor() {
this.head = null;
this.tail = null;
}
find(value) { // 노드 탐색
let currNode = this.head;
while (currNode.value !== value) {
currNode = currNode.next; // 노드를 찾을때까지 다음 노드로 이동
}
return currNode;
}
append(newValue) { // 끝부분 노드 추가
const newNode = new Node(newValue); // 노드 생성
if (this.head == null) { // 연결될 노드가 없다면 head와 tail은 자신
// undefined 로 떠서 == 으로 수정함.. 맞는건가??????????????????????
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode; // 테일포인터를 새로 생성된 노드를 가르키게 함
this.tail = newNode; // 새로 생성된 노드를 테일로 지정
}
}
insert(node, newValue) {
const newNode = new Node(newValue); // 노드 생성
newNode.next = node.next; // 생성된 노드의 다음을 입력받은 노드의 다음을 가르키도록 설정
node.next = newNode; // 입력받은 노드의 다음을 생성된 노드를 가르키면서, 생성된 노드를 중간에 끼워넣음
}
remove(value) {
let prevNode = this.head; // 삭제할 값 탐색
while (prevNode.next.value !== value) {
prevNode = prevNode.next;
}
if (prevNode.next !== null) { // 삭제할 값을 찾으면
prevNode.next = prevNode.next.next; // 이전 노드에서 삭제할 값에게 향하는 포인터를, 다음 노드로 향하게 함
} // 포인터를 받지 못하는 노드는 가비지컬렉터가 삭제
}
display() {
let currNode = this.head; // 현재 노드는 head
let displayString = "[";
while (currNode !== null) {
displayString += `${currNode.value}, `; // 노드값 추가
currNode = currNode.next; // 다음 노드로 이동
}
displayString = displayString.substr(0, displayString.length-2); // 뒤에 2글자 삭제
displayString += "]"
console.log(displayString);
}
size() { // size 메서드 구현
let currNode = this.head; // 현재 노드는 head
let size = 1;
if (this.head == null) { // 노드가 없다면 0 리턴
return 0;
}
while (currNode !== this.tail) {
size++;
currNode = currNode.next; // 다음 노드로 이동
}
return size
}
}