#include <iostream>
using namespace std;
// 定义链表节点结构
struct Node {
int data;
Node* next;
};
// 初始化循环链表
void initList(Node* &head) {
head = nullptr;
}
// 判断链表是否为空
bool isEmpty(Node* head) {
return head == nullptr;
}
// 在链表尾部插入节点
void insertAtEnd(Node* &head, int data) {
Node* newNode = new Node;
newNode->data = data;
if (isEmpty(head)) {
head = newNode;
newNode->next = head;
} else {
Node* temp = head;
while (temp->next != head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = head;
}
}
// 在链表头部插入节点
void insertAtFront(Node* &head, int data) {
Node* newNode = new Node;
newNode->data = data;
if (isEmpty(head)) {
head = newNode;
newNode->next = head;
} else {
Node* temp = head;
while (temp->next != head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = head;
head = newNode;
}
}
// 删除链表中的节点
void deleteNode(Node* &head, int data) {
if (isEmpty(head)) {
cout << "链表为空,无法删除节点" << endl;
return;
}
Node* temp = head;
Node* prev = nullptr;
// 找到要删除的节点
do {
if (temp->data == data) {
break;
}
prev = temp;
temp = temp->next;
} while (temp != head);
// 如果找到了要删除的节点
if (temp->data == data) {
if (temp == head && temp->next == head) {
// 链表中只有一个节点
head = nullptr;
} else if (temp == head) {
// 删除头节点
Node* last = head;
while (last->next != head) {
last = last->next;
}
head = head->next;
last->next = head;
} else {
// 删除中间节点或尾节点
prev->next = temp->next;
}
delete temp;
cout << "节点 " << data << " 已删除" << endl;
} else {
cout << "未找到节点 " << data << endl;
}
}
// 打印链表
void printList(Node* head) {
if (isEmpty(head)) {
cout << "链表为空" << endl;
return;
}
Node* temp = head;
do {
cout << temp->data << " ";
temp = temp->next;
} while (temp != head);
cout << endl;
}
int main() {
Node* head;
initList(head);
insertAtEnd(head, 10);
insertAtEnd(head, 20);
insertAtEnd(head, 30);
cout << "链表内容:" << endl;
printList(head);
insertAtFront(head, 5);
cout << "链表内容:" << endl;
printList(head);
deleteNode(head, 20);
cout << "链表内容:" << endl;
printList(head);
return 0;
}