试编写带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点 是唯一的用C语言实现
时间: 2024-12-14 09:15:10 浏览: 47
在C语言中,我们可以创建一个指向头结点的指针,并维护两个指针:`current` 和 `minNode`。`current` 指向当前节点,`minNode` 初始时指向头结点。如果找到比当前最小值还小的节点,则更新 `minNode`。遍历链表的同时,一旦遇到一个等于或大于 `minNode` 指向的节点,就删除它并继续前进。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 删除最小值节点函数
ListNode* deleteMin(ListNode* head) {
if (head == NULL || head->next == NULL) { // 如果链表为空或只有一个元素
free(head);
return NULL;
}
ListNode* minNode = head; // 初始化最小值节点为头节点
ListNode* current = head->next;
while (current != NULL) {
if (current->val < minNode->val) { // 找到新最小值
minNode = current;
}
current = current->next;
}
// 删除最小值节点
if (head == minNode) { // 如果最小值是最开始的节点
head = head->next;
} else {
minNode->next = minNode->next->next;
}
// 释放内存
free(minNode);
return head;
}
// 测试函数
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->val);
temp = temp->next;
}
printf("\n");
}
int main() {
// 创建示例链表
ListNode* list = malloc(sizeof(ListNode));
list->val = 4;
list->next = malloc(sizeof(ListNode));
list->next->val = 2;
list->next->next = malloc(sizeof(ListNode));
list->next->next->val = 5;
list->next->next->next = malloc(sizeof(ListNode));
list->next->next->next->val = 1; // 最小值
printf("Original List: ");
printList(list);
list = deleteMin(list);
printf("List after deleting minimum: ");
printList(list);
return 0;
}
```
运行这个程序,它会删除给定链表中的最小值节点,并打印出处理后的链表。注意,在实际应用中,记得检查链表是否为空以及是否有多个最小值的情况。
阅读全文
相关推荐


















