24.png

    1. /*
    2. 删除链表中唯一的最小值
    3. 分析:
    4. 目前能想到的就是遍历整个链表,记录下最小节点的指针,然后进行删除,时间复杂度为O(n).
    5. */
    6. struct Link {
    7. int data;
    8. struct Link* next;
    9. };
    10. #define _CRT_SECURE_NO_WARNINGS
    11. #include <stdio.h>
    12. #include <stdlib.h>
    13. void deleteMin(Link *p) {
    14. struct Link *preMinp = p, *minP = p->next,*preQ=p->next, *q = p->next->next,*f;
    15. while (q) {
    16. if (q->data < minP->data) {//如果比当前值更小
    17. minP = q;//更换
    18. preMinp = preQ;//前驱一起更换
    19. }
    20. preQ = q;//继续前进
    21. q = q->next;
    22. }
    23. f = minP;
    24. preMinp->next = minP->next;//删除
    25. free(f);//释放
    26. }
    27. int main() {
    28. int n,data;
    29. printf("请输入创建链表的节点个数:");
    30. scanf("%d",&n);
    31. struct Link *q;
    32. struct Link *head =(struct Link*) malloc(sizeof(struct Link));
    33. head->next = NULL;
    34. q = head;
    35. for (int i = 0; i < n;i++) {
    36. struct Link *newP = (struct Link*) malloc(sizeof(struct Link));
    37. printf("请输入第一个节点的值:");
    38. scanf("%d",&data);
    39. newP->data = data;
    40. newP->next = NULL;
    41. head->next = newP;
    42. head = head->next;//head要始终指向最新节点
    43. }
    44. head->next = NULL;
    45. head = q;//最后head要指向头结点
    46. printf("打印链表:");
    47. while (head->next) {
    48. printf("%d ", head->next->data);
    49. head = head->next;
    50. }
    51. head = q;
    52. deleteMin(head);
    53. printf("删除后链表值为:");
    54. while (head->next) {
    55. printf("%d ", head->next->data);
    56. head = head->next;
    57. }
    58. return 0;
    59. }