c语言给定一个带头节点的单链表,输入任意整数,将其中的相同的数删除只保留一个并将剩余数输出的代码
时间: 2024-10-24 12:12:46 浏览: 20
在C语言中,我们可以使用哈希表(也可以用数组或链表辅助数据结构)来实现这个功能。首先,遍历链表并同时检查每个元素是否已经在哈希表中。如果不在,就将其添加到链表中,并在哈希表中标记为已存在;如果已在哈希表中,则从链表中删除该元素。
以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 删除链表中重复的元素
ListNode* removeDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
// 使用哈希表辅助存储已经遇到过的值
ListNode* cur = head;
ListNode** hashTable = malloc(sizeof(ListNode*) * 100); // 假设最多100个不同的值
for (int i = 0; i < 100; i++) {
hashTable[i] = NULL;
}
while (cur != NULL) {
if (hashTable[cur->val] == NULL) { // 如果值未见过
hashTable[cur->val] = cur;
cur = cur->next;
} else {
ListNode* temp = cur->next;
free(cur);
cur = temp;
}
}
return hashTable[0];
}
// 打印链表
void printList(ListNode* head) {
ListNode* node = head;
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 示例链表创建
ListNode* list = createNode(1);
list->next = createNode(2);
list->next->next = createNode(2);
list->next->next->next = createNode(3);
list->next->next->next->next = createNode(4);
list->next->next->next->next->next = createNode(4);
// 删除重复元素
list = removeDuplicates(list);
// 打印结果
printList(list);
return 0;
}
```
注意:这个示例假设所有值都在0到99之间,实际应用中需要调整哈希表大小以适应实际情况。同时,为了简化示例,这里并未考虑内存管理。在实际生产环境中,应确保正确释放不再使用的内存。
阅读全文