设计一个算法,用头插法建立一个链表,删除该链表中值最大的节点,要求使用C/C++编程语言,需要给出代码
时间: 2024-11-18 17:27:13 浏览: 29
设计一个算法来使用头插法(也称为前缀插入)构建链表并在删除最大值的同时保持链表结构,首先需要创建一个链表节点结构,并实现一些基本操作,如添加新元素、查找最大值以及删除最大节点。以下是C++代码示例:
```cpp
#include <iostream>
// 链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
class MaxList {
private:
// 指向当前最大值节点的指针
ListNode* maxNode;
public:
// 添加新节点到链表,并更新最大值
void addNode(int val) {
ListNode* newNode = new ListNode(val);
if (!maxNode || val > maxNode->val) { // 如果是第一个节点或新值更大,则设新节点为最大值
maxNode = newNode;
}
newNode->next = head; // 插入到链表头部
head = newNode;
}
// 删除最大节点并返回其值(如果存在)
int removeMax() {
if (!maxNode) { // 如果链表为空,直接返回0
return 0;
}
int maxValue = maxNode->val; // 先保存最大值
ListNode* current = head;
while (current->next != maxNode) {
current = current->next;
}
// 删除最大节点
current->next = maxNode->next;
delete maxNode;
maxNode = nullptr; // 更新最大值节点
return maxValue;
}
// 初始化空链表
MaxList() : head(nullptr) {}
// 链表头节点
ListNode* getHead() const { return head; }
};
int main() {
MaxList list;
list.addNode(5);
list.addNode(10);
list.addNode(15);
list.addNode(3);
std::cout << "Before deletion: ";
while (list.getHead()) {
std::cout << list.getHead()->val << " -> ";
list.getHead() = list.getHead()->next;
}
std::cout << "0\n";
int removedValue = list.removeMax();
std::cout << "Removed value: " << removedValue << "\n";
std::cout << "After deletion: ";
while (list.getHead()) {
std::cout << list.getHead()->val << " -> ";
list.getHead() = list.getHead()->next;
}
std::cout << "0\n";
return 0;
}
```
这个`MaxList`类实现了头插法链表,并能动态地维护最大值。每次添加新节点时,会自动更新最大值;当需要删除最大值时,会找到并移除它。
阅读全文
相关推荐


















