class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this._size = 0;
}
// 연결리스트 끝에 추가하는 메소드
addToTail(value) {
let node = new Node(value)
this._size ++;
// 1. 데이터를 처음으로 추가할 때, head와 tail에 각각 node 할당
// 2. 데이터가 이미 있는 경우.
// 2-1. tail.next 는 새로 만든 노드에 연결되게 하기
// 2-2. tail 은 새로만든 노드로 변경
}
// 연결해제하는 메소드
remove(value) {
// 0. 데이터가 있는 경우에만 실행
// 1. 헤드와 value 가 같을 때
// 1-1. 헤드를 다음 노드로 변경하기
// 1-2. 사이즈 줄이기
// 2. 헤드가 아닌경우 while문 돌릴 예정
let prevHead = this.head; // head 를 저장
let newHead = prevHead.next; // head 다음 노드를 저장
let size = this._size; // 사이즈 쓸일이 있어서 복사
while (size) {
// 2-1. newHead 가 value와 같을 경우
// 2-1-1. newHead 가 꼬리일 경우
// preHead를 꼬리로 만들기
// 꼬리도 preHead로 만들기
// 자바스크립트라서 기존데이터가 쓸모없는데이터가 되면 알아서 사라짐(가비지 컬렉션)
this._size--;
}
// 2-1-2. newHead가 꼬리가 아닐 경우
//prevHead를 newHead 다음 노드와 연결
this._size--;
}
// 2-1-3. 단계가 끝나면 while문 멈추기
// 2-2. newHead 가 value가 아닐 경우
// preHead에 다음 노드 넣어서 while문 진행하기
size--;
}
}
// 주어진 index 노드 찾아서 반환하는 메소드
getNodeAt(index) {
let checkHead = this.head
while(index > -1) {
// 1. if index 가 0이고 checkHead 가 데이터가 있으면 반환
// 2. if index 가 0 보다 큰 경우
index--
// 2-1. 다음 노드값이 없는경우 undefined 리턴
// 2-2. 다음 노드값이 있는있는경우 checkHead 다음 노드로 할당 후 while문 진행
}
// 3. 여기까지해도 리턴되는 게 없으면
return undefined;
}
// 연결리스트에 해당 값이 있는지 존재유무 리턴
contains(value) {
// getNodeAt 메소드와 비슷하게 진행하면 됨.
}
// 주어진 값의 인덱스를 반환하는 메소드(없으면 -1 리턴)
indexOf(value) {
// getNodeAt 메소드와 비슷하게 진행하면 됨.
}
// linked-list 크기 반환하는 메소드
size() {
return this._size;
}
}
module.exports = LinkedList;