已知一个带头节点的循环链表为list,设计一个完整的c++代码,删除列表中数据阈值为item的所有节点
时间: 2024-10-08 16:09:04 浏览: 34
在C++中,要删除循环链表中所有等于给定阈值`item`的节点,你可以编写以下代码。首先,我们需要定义链表节点结构以及一些辅助函数。这里我们假设循环链表的头节点有一个整数值`value`。
```cpp
#include <iostream>
// 链表节点定义
struct ListNode {
int value;
ListNode* next;
};
// 创建循环链表的函数
ListNode* createCircularLinkedList(int* arr, int size, int item) {
ListNode* head = new ListNode{arr[0], nullptr};
ListNode* tail = head;
for (int i = 1; i < size; ++i) {
tail->next = new ListNode{arr[i], nullptr};
tail = tail->next;
}
tail->next = head; // 创建循环
if (head->value == item) {
return deleteList(head, item);
} else {
return head;
}
}
// 删除含有item的节点并返回新头
ListNode* deleteList(ListNode* head, int item) {
ListNode* current = head;
bool foundStart = false;
while (!foundStart || current != head) {
if (current->value == item) {
if (!foundStart) { // 如果找到了起始点
ListNode* temp = current;
foundStart = true;
} else { // 删除已找到的节点
current->next = current->next->next;
delete temp;
}
}
current = current->next;
}
return head;
}
// 打印链表帮助测试
void printList(ListNode* head) {
ListNode* temp = head;
do {
std::cout << temp->value << " ";
temp = temp->next;
} while (temp != head);
std::cout << "\n";
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int size = sizeof(arr) / sizeof(arr[0]);
int item = 3;
ListNode* list = createCircularLinkedList(arr, size, item);
std::cout << "Original List (before deletion): ";
printList(list);
list = deleteList(list, item);
std::cout << "List after deleting nodes with value " << item << ": ";
printList(list);
return 0;
}
```
这段代码首先创建了一个循环链表,然后删除所有值为`item`的节点,并更新链表。最后,它打印出原始链表和处理后的链表。
阅读全文