数据结构每日一题day18(链表)★★★★★

发布于:2025-05-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

题目描述:试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点唯一)。

算法思想:

  1. 初始化指针:创建两个指针prev和current,分别指向头结点和头结点的下一个节点。
  2. 遍历链表:遍历链表,寻找最小值节点及其前驱节点。
  3. 删除最小值节点:找到最小值节点后,通过修改前驱节点的next指针来删除最小值节点。
  4. 返回结果:返回删除后的链表。

复杂度分析:

时间复杂度: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;
}


网站公告

今日签到

点亮在社区的每一天
去签到