题目描述:试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点唯一)。
算法思想:
- 初始化指针:创建两个指针prev和current,分别指向头结点和头结点的下一个节点。
- 遍历链表:遍历链表,寻找最小值节点及其前驱节点。
- 删除最小值节点:找到最小值节点后,通过修改前驱节点的next指针来删除最小值节点。
- 返回结果:返回删除后的链表。
复杂度分析:
时间复杂度:O(n )
空间复杂度:O(1)
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// 定义单链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在带头结点的单链表中删除最小值节点
Node* deleteMin(Node* head) {
Node* prev = head; // 前驱节点指针
Node* current = head->next; // 当前节点指针
Node* minPrev = head; // 最小值节点的前驱节点
int minValue = INT_MAX; // 最小值初始化为最大整数
// 遍历链表,寻找最小值节点及其前驱节点
while (current != NULL) {
if (current->data < minValue) {
minValue = current->data;
minPrev = prev;
}
prev = current;
current = current->next;
}
// 删除最小值节点
if (minPrev != NULL && minPrev->next != NULL) {
Node* temp = minPrev->next;
minPrev->next = temp->next;
free(temp);
}
return head;
}
// 打印链表
void printList(Node* head) {
Node* current = head->next; // 跳过头结点
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
// 测试代码
int main() {
// 创建带头结点的链表: head->1->3->5->2->4
Node* head = createNode(0); // 头结点,数据域不使用
head->next = createNode(1);
head->next->next = createNode(3);
head->next->next->next = createNode(5);
head->next->next->next->next = createNode(2);
head->next->next->next->next->next = createNode(4);
printf("Original list: ");
printList(head);
// 删除最小值节点
head = deleteMin(head);
printf("List after deleting min: ");
printList(head);
// 释放内存(简单起见,这里不实现完整的释放逻辑)
return 0;
}