Circular Linked List
#include <bits/stdc++.h>
using namespace std;
class CircularLinkedList {
protected:
class CircularNode {
public:
int data;
CircularNode *next;
CircularNode() {
data = 0;
next = NULL;
}
CircularNode(int data) {
this->data = data;
this->next = NULL;
}
};
CircularNode *head;
CircularNode *tail;
int size;
public:
CircularLinkedList() {
head = NULL;
tail = NULL;
size = 0;
}
CircularNode *begin() { return head; }
CircularNode *end() { return tail; }
bool empty() { return head == NULL; }
void clear() {
CircularNode *temp = head;
while (temp != tail) {
CircularNode *next = temp->next;
delete temp;
temp = next;
}
if (temp != NULL) {
delete temp;
}
head = NULL;
tail = NULL;
size = 0;
}
void reverse() {
CircularNode *prev = tail;
CircularNode *current = head;
CircularNode *next = NULL;
while (current != tail) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
current->next = prev;
head = current;
tail = next;
}
int at(int pos) {
if (pos > size || pos <= 0) {
cout << "Invalid position" << endl;
return -1;
}
CircularNode *temp = head;
for (int i = 0; i < pos; i++) temp = temp->next;
return temp->data;
}
int front() {
if (empty()) {
cout << "List is empty. Returning -1" << endl;
return -1;
} else
return head->data;
}
int back() {
if (empty()) {
cout << "List is empty. Returning -1" << endl;
return -1;
} else
return tail->data;
}
void insertAtTail(int d) {
CircularNode *newNode = new CircularNode(d);
if (empty()) {
head = newNode;
tail = newNode;
newNode->next = newNode;
} else {
tail->next = newNode;
newNode->next = head;
tail = newNode;
}
size++;
}
void insertAtHead(int d) {
CircularNode *newNode = new CircularNode(d);
if (empty()) {
head = newNode;
tail = newNode;
newNode->next = newNode;
} else {
tail->next = newNode;
newNode->next = head;
head = newNode;
}
size++;
}
void insertAtPos(int pos, int d) {
if (pos > size || pos <= 0) {
cout << "Invalid position" << endl;
return;
}
if (pos == 1) {
insertAtHead(d);
return;
}
if (pos == size) {
insertAtTail(d);
return;
}
CircularNode *newNode = new CircularNode(d);
CircularNode *temp = head;
for (int i = 0; i < pos - 1; i++) temp = temp->next;
newNode->next = temp->next;
temp->next = newNode;
size++;
}
void deleteAtHead() {
if (empty()) {
cout << "List is empty." << endl;
return;
}
if (size == 1) {
clear();
return;
}
CircularNode *temp = head;
head = head->next;
delete temp;
size--;
}
void deleteAtTail() {
if (empty()) {
cout << "List is empty." << endl;
return;
}
if (size == 1) {
clear();
return;
}
CircularNode *temp = head;
while (temp->next != tail) temp = temp->next;
tail = temp;
temp->next = head;
delete tail->next;
size--;
}
void deleteNextNode(CircularNode *node) {
if (empty()) {
cout << "List is empty." << endl;
return;
}
if (node == head && node == tail) {
clear();
return;
}
if (node == NULL) {
cout << "Invalid node." << endl;
return;
}
CircularNode *temp = node->next;
node->next = temp->next;
delete temp;
size--;
return;
}
void deleteAtPos(int pos) {
if (pos > size || pos <= 0) {
cout << "Invalid position" << endl;
return;
}
if (pos == 1) {
deleteAtHead();
return;
}
if (pos == size) {
deleteAtTail();
return;
}
CircularNode *temp = head;
for (int i = 0; i < pos - 1; i++) temp = temp->next;
deleteNextNode(temp);
}
};
Last updated