数据结构每日一题day18(链表)★★★★★
题目描述:试编写在带头结点的单链表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->4Node* 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;
}