개발
[자료구조] 연결리스트 홀수노드만 분리
0hyeon의
2023. 6. 4. 00:12
반응형
1.Delete all even nodes from a Singly Linked List
지난주 코딩테스트를 복기하며 코드를 복기하기위해 글을 올린다.
자바스크립트로, 연결리스트를 구현하고, 홀수노드만 반환하는 함수를 만들어보자.
연결리스트로 1,3,4,18,19 입력후,
홀수노드만 반환하는 함수를 만들기!
ex)
input 1 -> 3 -> 4 -> 18 -> 19
output 1 -> 3 -> 19
2.연결리스트 구현하기
class Node1 {
constructor(value) {
this.value = value;
this.next = null;
}
}
class singlyLinkedList {
constructor() {
this.head = null;
this.tail = null;
}
find(value) {
let curnNode = this.head;
while (curnNode !== null && curnNode.value !== value) {
//head가 null이 아닌경우 진행
curnNode = curnNode.next;
}
console.log("find : ", curnNode);
return curnNode;
}
append(newValue) {
const newNode = new Node1(newValue);
if (this.head === null) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode; //가리키고
this.tail = newNode; //꼬리 갱신
}
}
insert(node, newValue) {
//linkedList.insert(linkedList.find(2), 10);
const newNode = new Node1(newValue); //새로생성
newNode.next = node.next; //생성된아이의 next => 기존아이의 next
node.next = newNode; //기존아이의 next => 새로생성된 아이
}
remove(value) {
let prevNode = this.head;
while (prevNode.next.value !== value) {
prevNode = prevNode.next;
}
if (prevNode !== this.head) {
prevNode.next = prevNode.next.next;
}
}
display() {
let curnNode = this.head;
let displayString = "[";
while (curnNode !== null) {
displayString += `${curnNode.value}, `;
curnNode = curnNode.next;
}
displayString = displayString.substring(0, displayString.length - 2);
displayString += "]";
console.log(displayString);
}
}
const linkedList = new singlyLinkedList();
linkedList.append(1);
linkedList.append(3);
linkedList.append(4);
linkedList.append(18);
linkedList.append(19);
연결리스트는 자바스크립트 구현은 이미 경험이 있어서 작성하는데 어렵지 않았다.
3.홀수노드만 반환하는 함수 만들기
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
function deleteEven(head) {
// 입력으로 주어진 연결 리스트가 비어있는 경우 null을 반환합니다.
if (head === null) {
return null;
}
let oddHead = null; // 홀수 값을 가지는 노드들의 헤드 노드
let oddTail = null; // 홀수 값을 가지는 노드들의 마지막 노드
let curr = head; // 현재 순회 중인 노드
// 연결 리스트를 순회하면서 홀수 값을 가지는 노드들을 새로운 연결 리스트에 추가합니다.
while (curr !== null) {
if (curr.value % 2 !== 0) {
// 현재 노드의 값이 홀수인 경우
const newNode = new Node(curr.value);
if (oddHead === null) {
// 새로운 연결 리스트가 비어있는 경우
oddHead = newNode;
oddTail = newNode;
} else {
oddTail.next = newNode;
oddTail = newNode;
}
}
curr = curr.next;
}
return oddHead; // 홀수 값을 가지는 노드들로 이루어진 새로운 연결 리스트의 헤드 노드를 반환합니다.
}
연결리스트 구현후, 홀수만 반환하는 식으로 응용문제를 처음 풀어보고 발상을 해본적이 없어
쉽지는 않았지만 코드를 조금만 들여다보면 금방 이해가 된다.
4.출력부분
// deleteEven 함수 호출
const result = deleteEven(linkedList.find(1));
// 홀수 값 출력
let currNode = result;
while (currNode !== null) {
console.log(currNode.value);
currNode = currNode.next;
}
연결리스트 응용문제는 처음풀어보았다.
다음 비슷한 문제등장시 응용할수있게끔 완벽하게 내것으로 만들어보자.
반응형