📌  相关文章
📜  用于从排序链表中删除重复项的 C 程序(1)

📅  最后修改于: 2023-12-03 15:40:53.182000             🧑  作者: Mango

用于从排序链表中删除重复项的 C 程序

在排序链表中,经常需要去除重复的元素。下面是一个用于从排序链表中删除重复项的 C 程序:

// 用于从排序链表中删除重复项的 C 程序
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点
typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

// 创建链表
ListNode* createList(int arr[], int n) {
    if (n == 0) {
        return NULL;
    }
    ListNode *head = (ListNode*)malloc(sizeof(ListNode));
    head->val = arr[0];
    head->next = NULL;
    ListNode *cur = head;
    for (int i = 1; i < n; i++) {
        ListNode *node = (ListNode*)malloc(sizeof(ListNode));
        node->val = arr[i];
        node->next = NULL;
        cur->next = node;
        cur = cur->next;
    }
    return head;
}

// 打印链表
void printList(ListNode *head) {
    ListNode *cur = head;
    while (cur) {
        printf("%d ", cur->val);
        cur = cur->next;
    }
    printf("\n");
}

// 从排序链表中删除重复项
ListNode* deleteDuplicates(ListNode *head) {
    if (head == NULL) {
        return NULL;
    }
    ListNode *cur = head;
    while (cur->next != NULL) {
        if (cur->val == cur->next->val) {
            ListNode *temp = cur->next;
            cur->next = temp->next;
            free(temp);
        } else {
            cur = cur->next;
        }
    }
    return head;
}

int main() {
    int arr[] = {1, 2, 2, 3, 4, 4};
    int n = sizeof(arr) / sizeof(int);
    ListNode *head = createList(arr, n);
    printf("链表:");
    printList(head);
    head = deleteDuplicates(head);
    printf("去重后的链表:");
    printList(head);
    return 0;
}
程序说明

这个程序实现了从排序链表中删除重复项的功能。程序中主要包括以下几个部分:

  1. 定义链表节点结构体:使用 typedef 定义链表节点结构体 ListNode,包括一个整数 val 和一个指向下一个节点的指针 next
  2. 创建链表:定义一个 createList 函数,通过传入一个数组和数组长度来创建一个排序链表,并返回链表头指针。
  3. 打印链表:定义一个 printList 函数,用于打印排序链表的每个元素。
  4. 删除重复项:定义一个 deleteDuplicates 函数,用于从排序链表中删除重复项。该函数使用双指针法,使用一个指针 cur 遍历链表,一个指针 temp 指向当前节点的下一个节点。通过比较 cur->valtemp->val 是否相等来判断当前节点是否为重复项。如果是重复项,则释放重复节点的内存并修改指针;否则,继续遍历链表。
  5. 主程序:定义一个 main 函数,创建一个排序链表并打印。然后调用 deleteDuplicates 函数去重,并再次打印链表。
程序运行结果
链表:1 2 2 3 4 4 
去重后的链表:1 2 3 4 
总结

这个程序通过使用链表节点和双指针算法,实现了从排序链表中删除重复项的功能。程序中还包括了创建链表和打印链表的功能,方便程序员调试和验证程序的正确性。