有表头的链表怎么删除链表里的重复数据,用C语言写出代码
时间: 2024-03-26 08:34:56 浏览: 13
以下是用哈希表实现删除重复节点的C语言示例代码,其中假设链表的节点类型为 `ListNode`,包含一个整型的数据成员 `val` 和一个指向下一个节点的指针 `next`:
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* deleteDuplicates(ListNode* head) {
// 定义哈希表和指针变量
bool hash_set[10001] = {false};
ListNode *cur = head;
ListNode *pre = NULL;
// 遍历链表
while (cur) {
// 如果该节点的值已经出现过,则将该节点从链表中删除
if (hash_set[cur->val]) {
pre->next = cur->next;
free(cur);
cur = pre->next;
}
// 如果该节点的值没有出现过,则将该节点的值添加到哈希表中
else {
hash_set[cur->val] = true;
pre = cur;
cur = cur->next;
}
}
return head;
}
```
以上代码中,使用哈希表记录链表中已经出现过的元素,指针变量 `pre` 用于记录当前节点的前一个节点,以便将当前节点从链表中删除。当当前节点的值已经出现过时,将当前节点从链表中删除,并将指针 `cur` 指向下一个节点;否则将当前节点的值添加到哈希表中,并将指针 `pre` 和 `cur` 都指向下一个节点。最后返回头节点即可。
需要注意的是,在使用 `free` 函数释放链表节点内存时,应该先将指针 `cur` 指向下一个节点,以免出现野指针的问题。