编写尽量高效的算法DeleteSame(SqList &L),实现从无序顺序表中删除所有重复的元素,即使表中的所有元素值都各不相同。用c语言写
时间: 2024-10-27 12:02:56 浏览: 39
编写高效的算法 `DeleteSame` 来处理这个问题,我们可以使用一个哈希集合(如 C 语言中的 `unordered_set` 或者数组)来跟踪已经遇到过的元素。遍历输入的无序顺序表 `L`,对于每个元素,如果它不在哈希集合中,则添加到集合并移动指针;如果已经在集合中,则跳过这个元素。以下是用 C 语言实现的一个简化版:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
void DeleteSame(ListNode** head) {
if (*head == NULL) return;
ListNode* p = *head;
unordered_set<int> uniqueSet;
uniqueSet.insert(p->val);
while (p != NULL) {
if (uniqueSet.find(p->next->val) == uniqueSet.end()) {
uniqueSet.insert(p->next->val);
p = p->next;
} else {
ListNode* temp = p->next;
p->next = p->next->next;
free(temp);
}
}
}
// 插入节点和打印链表
void insert(ListNode** head, int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = *head;
*head = newNode;
}
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 示例:创建一个无序顺序表
ListNode* L = NULL;
insert(&L, 1);
insert(&L, 3);
insert(&L, 2);
insert(&L, 4);
insert(&L, 2);
printf("Before deletion:\n");
printList(L);
DeleteSame(&L);
printf("After deletion of duplicates:\n");
printList(L);
return 0;
}
```
阅读全文