设计一个高效的算法,删除非空单链表L中的(一个)最小值。用c语言写出代码
时间: 2024-10-16 09:16:31 浏览: 28
设计一个高效的算法来删除给定非空单链表L中的最小值,我们可以使用迭代的方式遍历链表,并维护两个指针,一个指向当前节点,另一个指向已找到的最小节点。以下是使用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新的链表节点
ListNode* createNode(int val) {
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 删除链表中的最小值
void deleteMinValue(ListNode **head) {
if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个元素
free(*head);
*head = NULL;
return;
}
ListNode *minNode = *head; // 初始化最小值为头节点
ListNode *current = minNode->next;
while (current != NULL && current->val < minNode->val) {
minNode = current;
current = current->next;
}
// 如果最小值不是头节点,则调整头指针
if (minNode != *head) {
minNode->next = minNode->next->next;
} else {
// 否则直接删除头节点
ListNode *temp = *head;
*head = (*head)->next;
free(temp);
}
}
// 打印链表帮助测试
void printList(ListNode *node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 示例链表:4 -> 2 -> 5 -> 1 -> 3
ListNode *list = createNode(4);
list->next = createNode(2);
list->next->next = createNode(5);
list->next->next->next = createNode(1);
list->next->next->next->next = createNode(3);
printf("Original List:");
printList(list);
deleteMinValue(&list);
printf("\nAfter deleting minimum value:");
printList(list);
return 0;
}
```
阅读全文