📅  最后修改于: 2023-12-03 15:27:10.192000             🧑  作者: Mango
本程序实现了从未排序的链表中删除重复项的功能,可以有效地去除重复数据项,并保留链表中的原有顺序。
对于一个未排序的链表,我们可以使用哈希表来存储每个节点的值,如果在遍历链表时遇到一个已经存在于哈希表中的节点,则删除该节点。具体流程如下:
head
以及一个哈希表map
首先定义节点结构体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;
}
其中,在遍历链表时,使用了两个指针prev
和curr
,分别指向当前节点和下一个节点。如果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