코딩 테스트 연습
Linkded List 구현하기
은돌1113
2024. 6. 27. 20:14
JavaScript 문법을 사용하여 Linked List를 구현해 보았습니다.
Node 클래스는 Linked List에서 각 노드를 나타내는 객체입니다.
각 노드는 데이터를 저장하는 부분인 data와 다음 노드를 가리키는 포인터인 next로 구성되어 있습니다.
class Node {
constructor(data) {
this.data = data;
this.next = null;
};
};
LinkedList 클래스의 constructor(생성자)입니다.
LinkedList는 비연속적인 데이터 구조이기 때문에 첫 번째 Node를 가르키는 head와 LinkedList의 길이를 담는 size로 구성되어 있습니다.
초기에는 LinkedList가 비어있기 때문에 head = null과 size = 0으로 설정되어 있습니다.
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
};
};
LinkedList 클래스의 add 메서드입니다. 리스트의 마지막에 노드를 추가할 때 사용합니다.
add(data) {
const newNode = new Node(data); // 파라미터로 받아온 data로 새로운 노드를 생성합니다.
let current; // 현재 노드
if (this.head == null) { // 리스트가 비어있는 경우
this.head = newNode; // 새 노드를 리스트의 맨 처음 노드로 설정합니다.
} else { // 리스트에 이미 노드가 있는 경우
current = this.head; // current 변수에 head를 할당하여 리스트의 첫 번째 노드부터 시작합니다.
while (current.next) { // 리스트의 마지막 노드까지 이동합니다.
current = current.next; // current를 다음 노드로 이동합니다.
}
current.next = newNode; // 마지막 노드의 다음에 새로운 노드를 연결합니다.
}
this.size++; // 리스트의 길이를 증가시킵니다.
};
LinkedList 클래스의 insert 메서드입니다. 노드를 LinkedList 맨 앞이나 주어진 위치에 삽입할 때 사용합니다.
insert(data, index) {
// 인덱스가 양수이면서 리스트의 길이보다 작거나 같은 지 확인 후 조건에 부합하지 않은 경우 return 합니다.
if (!(index >= 0 && index <= this.size)) {
console.error('범위를 벗어났습니다.');
return;
};
const newNode = new Node(data); // 파라미터로 받아온 data로 새로운 노드를 생성합니다.
let current = this.head; // 현재 노드
let currentIndex = 0; // 현재 인덱스
let prev = null; // 이전 노드
if (index === 0) { // 인덱스가 0인 경우, 새로운 노드를 리스트의 맨 앞에 삽입합니다.
newNode.next = this.head; // 새 노드의 다음을 현재 head로 설정합니다.
this.head = newNode; // head를 새 노드로 업데이트합니다.
} else {
while (currentIndex < index) { // 인덱스 위치까지 이동합니다.
prev = current; // 이전 노드를 현재 노드로 설정합니다.
current = current.next; // 현재 노드를 다음 노드로 이동합니다.
currentIndex++; // 현재 인덱스를 증가시킵니다.
};
prev.next = newNode; // 이전 노드의 다음을 새 노드로 설정하여 새 노드를 삽입합니다.
newNode.next = current; // 새 노드의 다음을 현재 노드로 설정하여 연결을 유지합니다.
};
this.size++; // 리스트의 길이를 증가시킵니다.
};
LinkedList 클래스의 delete 메서드입니다. 노드를 삭제할 때 사용합니다.
delete(data) {
let current = this.head; // 현재 노드
let prev = null; // 이전 노드
while (current) { // 현재 노드가 있을 때까지 반복문을 돌립니다.
if (current.data === data) { // 현재 노드의 데이터가 삭제할 데이터와 같은 경우
if (!prev) { // 맨 앞 노드인 경우
this.head = current.next; // head를 현재 노드의 다음 노드로 설정하여 첫 번째 노드를 삭제합니다.
} else { // 중간 or 마지막 노드인 경우
prev.next = current.next; // 이전 노드의 다음 노드를 현재 노드의 다음 노드로 설정하여 현재 노드를 건너뜁니다.
}
}
prev = current; // 이전 노드를 현재 노드로 설정합니다.
current = current.next; // 현재 노드를 다음 노드로 이동합니다.
}
}
LinkedList 클래스의 print 메서드입니다. 노드를 출력할 때 사용합니다.
print() {
let current = this.head;
while (current) { // 현재 노드가 있는 동안 반복문을 돌립니다.
console.log(current.data); // 현재 노드의 데이터를 콘솔에 출력합니다.
current = current.next; // 다음 노드를 현재 노드로 대체합니다.
}
}
전체 코드
더보기
더보기
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
}
add(data) {
const newNode = new Node(data);
let current;
if (this.head == null) {
this.head = newNode;
} else {
current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
this.size++;
}
delete(data) {
let current = this.head;
let prev = null;
while (current) {
if (current.data === data) {
if (!prev) {
this.head = current.next;
} else {
prev.next = current.next;
}
}
prev = current;
current = current.next;
}
}
insert(data, index) {
if (!(index >= 0 && index <= this.size)) {
console.error('범위를 벗어났습니다.');
return;
}
const newNode = new Node(data);
let current = this.head;
let currentIndex = 0;
let prev = null;
if (index === 0) {
newNode.next = this.head;
this.head = newNode;
} else {
while (currentIndex < index) {
prev = current;
current = current.next;
currentIndex++;
}
prev.next = newNode;
newNode.next = current;
}
this.size++;
}
print() {
let current = this.head;
while (current) {
console.log(current.data);
current = current.next;
}
}
}
const linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
console.log('------ 추가 ------');
linkedList.print(); // 1 2 3 4
linkedList.insert(5, 4);
console.log('------ 삽입 ------');
linkedList.print(); // 1 2 3 4 5
linkedList.delete(3);
console.log('------ 삭제 ------');
linkedList.print(); // 1 2 4 5