728x90
반응형
원형 연결 리스트는 마지막 노드가 첫 번째 노드를 가리키도록 연결된 연결 리스트입니다.
이는 리스트의 끝에서 다시 처음으로 순환할 수 있게 하여 특정 유형의 문제에 유용합니다.
원형 연결 리스트는 단일 연결 리스트와 달리,
끝이 명확하지 않으므로 반복 작업에서 유용할 수 있습니다.
#include <iostream>
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
class CircularLinkedList {
private:
Node* head;
public:
CircularLinkedList() : head(nullptr) {}
// 노드 추가
void append(int data) {
Node* newNode = new Node(data);
if (!head) {
head = newNode;
head->next = head;
} else {
Node* temp = head;
while (temp->next != head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = head;
}
}
// 노드 출력
void printList() {
if (!head) {
std::cout << "리스트가 비어 있습니다.\n";
return;
}
Node* temp = head;
do {
std::cout << temp->data << " ";
temp = temp->next;
} while (temp != head);
std::cout << std::endl;
}
// 소멸자
~CircularLinkedList() {
if (!head) return;
Node* current = head;
Node* nextNode;
do {
nextNode = current->next;
delete current;
current = nextNode;
} while (current != head);
}
};
int main() {
CircularLinkedList cll;
cll.append(10);
cll.append(20);
cll.append(30);
cll.append(40);
cll.printList(); // 출력: 10 20 30 40
return 0;
}
코드 설명
- 노드 추가
'append' 함수는 리스트의 끝에 새로운 노드를 추가합니다.
첫 번째 노드는 자기 자신을 가리키도록 설정됩니다 ('head->next = head')
그 이후 추가되는 노드는 리스트의 끝에 삽입되고,
새로운 노드의 'next' 포인터가 'head'를 가리키도록 합니다. - 노드 출력
'printList' 함수는 리스트의 모든 노드를 순환하며 출력합니다.
리스트가 비어 있는 경우, "리스트가 비어 있습니다."라는 메시지를 출력합니다.
비어 있지 않은 경우, 'head'부터 시작하여 순환하며 각 노드의 데이터를 출력합니다. - 소멸자
소멸자 '~CircularLinkedList'는 리스트의 모든 노드를 해제하여 메모리 누수를 방지합니다.
순환 구조로 인해 모든 노드를 순환하면서 하나씩 삭제합니다.
주요 특징
- 순환 구조
마지막 노드의 `next` 포인터가 첫 번째 노드를 가리킵니다. - 항상 연결됨
리스트의 어떤 지점에서도 리스트의 모든 노드를 순환할 수 있습니다. - 시작 지점 없음
어떤 노드도 리스트의 시작점이 될 수 있습니다.
728x90
반응형
'Application > 기초' 카테고리의 다른 글
[기초] C++ 선형 탐색 (Linear Search) (0) | 2024.05.16 |
---|---|
[기초] C++ Linked List : 원형 이중 연결 리스트 (0) | 2024.05.15 |
[기초] C++ Linked List : 양방향 연결 리스트 (0) | 2024.05.13 |
[기초] C++ Linked List : 연결 리스트 (0) | 2024.05.12 |
[기초] C++ 알고리즘 : 계수 정렬 (Counting Sort) (0) | 2024.05.11 |