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

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

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

本程序实现了从未排序的链表中删除重复项的功能,可以有效地去除重复数据项,并保留链表中的原有顺序。

实现思路

对于一个未排序的链表,我们可以使用哈希表来存储每个节点的值,如果在遍历链表时遇到一个已经存在于哈希表中的节点,则删除该节点。具体流程如下:

  1. 定义一个指向链表头节点的指针head以及一个哈希表map
  2. 遍历链表,对于每个节点:
    1. 判断当前节点的值是否已经在哈希表中存在,如果存在,则删除该节点
    2. 如果当前节点的值在哈希表中不存在,则将该值添加到哈希表中
  3. 返回处理后的链表
代码实现
定义节点结构体

首先定义节点结构体Node,用于表示链表中的每个节点。结构体中包括节点的值val和指向下一个节点的指针next

struct Node {
    int val;
    Node* next;
    Node(int x) : val(x), next(NULL) {}
};
实现删除重复节点的函数

接下来实现删除重复节点的函数removeDuplicates。函数中需要定义一个指向链表头节点的指针head以及一个哈希表map,用于存储节点值及其出现的次数。

Node* removeDuplicates(Node* head) {
    if (head == NULL) return NULL;
    unordered_map<int, int> map;
    Node* prev = NULL, *curr = head;
    while (curr != NULL) {
        if (map.count(curr->val)) {
            prev->next = curr->next;
            delete curr;
        } else {
            map[curr->val]++;
            prev = curr;
        }
        curr = prev->next;
    }
    return head;
}

其中,在遍历链表时,使用了两个指针prevcurr,分别指向当前节点和下一个节点。如果curr节点的值已经在哈希表中存在,则删除该节点;否则,将该值添加到哈希表中,并更新prev的值为curr

测试代码

最后,使用以下测试代码来验证程序的正确性。

int main() {
    Node* head = new Node(1);
    head->next = new Node(2);
    head->next->next = new Node(3);
    head->next->next->next = new Node(2);
    head->next->next->next->next = new Node(4);

    cout << "original list: ";
    printList(head);

    head = removeDuplicates(head);

    cout << "processed list: ";
    printList(head);

    return 0;
}

其中,printList函数用于输出链表的值,并没有实现在本程序中。运行结果如下:

original list: 1 -> 2 -> 3 -> 2 -> 4
processed list: 1 -> 2 -> 3 -> 4