用C++编写完整的代码,已知一个不带头结点的单链表head中存放了一组整型数,构造算法,删除链表中值最大的结点
时间: 2024-09-10 19:29:51 浏览: 82
要删除单链表中值最大的节点,我们需要遍历链表以找到最大值的节点,并记录该节点的前驱节点。然后,我们可以重新链接链表,使前驱节点指向最大值节点的下一个节点,从而删除最大值节点。以下是实现该算法的C++代码示例:
```cpp
#include <iostream>
// 定义链表节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 删除链表中值最大的节点
void deleteMaxNode(ListNode*& head) {
if (!head || !(head->next)) {
// 如果链表为空或者只有一个节点,则不进行操作
return;
}
ListNode *current = head;
ListNode *prev = nullptr; // 最大值节点的前驱节点
ListNode *maxPrev = nullptr; // 最大值节点的前驱节点
int maxValue = head->val; // 假设第一个节点的值是最大的
while (current) {
if (current->val > maxValue) {
maxValue = current->val;
maxPrev = prev;
}
prev = current;
current = current->next;
}
// 如果最大值节点是头节点
if (maxValue == head->val) {
head = head->next;
delete head->prev; // 删除原头节点
return;
}
// 删除最大值节点
if (maxPrev) {
maxPrev->next = maxPrev->next->next;
delete maxPrev->next; // 删除最大值节点
maxPrev->next = nullptr; // 可选操作,防止野指针
}
}
// 辅助函数:打印链表
void printList(ListNode* head) {
while (head) {
std::cout << head->val << " ";
head = head->next;
}
std::cout << std::endl;
}
// 辅助函数:释放链表内存
void freeList(ListNode*& head) {
ListNode* temp;
while (head) {
temp = head;
head = head->next;
delete temp;
}
}
int main() {
// 示例:创建链表 1->3->2->4->5
ListNode* head = new ListNode(1);
head->next = new ListNode(3);
head->next->next = new ListNode(2);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
std::cout << "Original list: ";
printList(head);
deleteMaxNode(head);
std::cout << "List after deleting max node: ";
printList(head);
// 释放链表内存
freeList(head);
return 0;
}
```
这段代码首先定义了单链表节点的结构体`ListNode`,然后实现了`deleteMaxNode`函数来删除链表中的最大值节点。`main`函数中给出了创建和操作链表的示例。
阅读全文