
/* 删除链表中唯一的最小值 分析: 目前能想到的就是遍历整个链表,记录下最小节点的指针,然后进行删除,时间复杂度为O(n).*/struct Link { int data; struct Link* next;};#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>void deleteMin(Link *p) { struct Link *preMinp = p, *minP = p->next,*preQ=p->next, *q = p->next->next,*f; while (q) { if (q->data < minP->data) {//如果比当前值更小 minP = q;//更换 preMinp = preQ;//前驱一起更换 } preQ = q;//继续前进 q = q->next; } f = minP; preMinp->next = minP->next;//删除 free(f);//释放}int main() { int n,data; printf("请输入创建链表的节点个数:"); scanf("%d",&n); struct Link *q; struct Link *head =(struct Link*) malloc(sizeof(struct Link)); head->next = NULL; q = head; for (int i = 0; i < n;i++) { struct Link *newP = (struct Link*) malloc(sizeof(struct Link)); printf("请输入第一个节点的值:"); scanf("%d",&data); newP->data = data; newP->next = NULL; head->next = newP; head = head->next;//head要始终指向最新节点 } head->next = NULL; head = q;//最后head要指向头结点 printf("打印链表:"); while (head->next) { printf("%d ", head->next->data); head = head->next; } head = q; deleteMin(head); printf("删除后链表值为:"); while (head->next) { printf("%d ", head->next->data); head = head->next; } return 0;}