ff…… 2023-09-25 09:43 采纳率: 90.9%
浏览 22
已结题

编写算法,将单链表中数值重复的节点删除,使所得结果表中的各结点值各不相同。

编写算法,将单链表中数值重复的节点删除,使所得结果表中的各结点值各不相同。
要求:用C语言实现各函数,函数内要有注释,对函数的调用方法,参数和返回值含义进行说明。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-09-25 09:53
    关注

    引自免费小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还请采纳。


    #include <stdlib.h>
    
    // 定义单链表节点结构
    typedef struct Node {
        int data;           // 数据域
        struct Node* next;  // 指针域,指向下一个节点
    } Node;
    
    // 创建单链表
    Node* createLinkedList(int arr[], int n) {
        Node* head = NULL;  // 头节点
        Node* tail = NULL;  // 尾节点
    
        // 遍历数组,逐个创建节点,并将节点连接起来
        for (int i = 0; i < n; i++) {
            Node* newNode = (Node*)malloc(sizeof(Node));
            newNode->data = arr[i];
            newNode->next = NULL;
    
            if (head == NULL) {
                head = newNode;
                tail = newNode;
            } else {
                tail->next = newNode;
                tail = newNode;
            }
        }
    
        return head;
    }
    
    // 删除单链表中数值重复的节点
    void removeDuplicates(Node* head) {
        if (head == NULL) {
            return;
        }
    
        Node* curr = head;
        while (curr != NULL) {
            Node* prev = curr;
            Node* next = curr->next;
    
            // 遍历当前节点后面的节点,删除数值重复的节点
            while (next != NULL) {
                if (next->data == curr->data) {
                    prev->next = next->next;
                    free(next);
                    next = prev->next;
                } else {
                    prev = next;
                    next = next->next;
                }
            }
    
            curr = curr->next;
        }
    }
    
    // 打印单链表
    void printLinkedList(Node* head) {
        Node* curr = head;
        while (curr != NULL) {
            printf("%d ", curr->data);
            curr = curr->next;
        }
        printf("\n");
    }
    
    int main() {
        int arr[] = {1, 2, 3, 2, 4, 5, 4};
        int n = sizeof(arr) / sizeof(arr[0]);
    
        Node* head = createLinkedList(arr, n);
        printf("原始链表:");
        printLinkedList(head);
    
        removeDuplicates(head);
        printf("删除重复节点后的链表:");
        printLinkedList(head);
    
        return 0;
    }
    

    该算法的时间复杂度为O(n^2),其中n为链表的长度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 创建了问题 9月25日