c语言给定一个带头节点的单链表,输入任意整数不超过50个,将其中的相同的数删除只保留一个并将剩余数输出的代码
时间: 2024-10-24 12:12:39 浏览: 9
c代码-将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在 C 语言中,你可以使用链表遍历和哈希表来解决这个问题。首先创建一个哈希表存储已经遇到过的数字,然后遍历链表,如果当前元素不在哈希表中,则添加到链表并将其加入哈希表;如果已经在哈希表中,则跳过。以下是简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 删除链表中重复的节点
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) {
return head;
}
// 使用哈希表记录已见过的值
int hash[51] = {0}; // 初始化一个大小为51的数组表示最多50个整数
ListNode *curr = head;
while (curr) {
if (hash[curr->val] == 0) {
// 如果未见,添加到链表并标记为已见
hash[curr->val] = 1;
curr = curr->next;
} else {
// 已经存在该值,跳过
ListNode *temp = curr->next;
free(curr);
curr = temp;
}
}
return head;
}
// 打印链表中的元素
void printList(ListNode* head) {
ListNode *curr = head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
}
int main() {
// 假设你已经有了一个带头结点的链表头指针 head
ListNode* head = ...; // 实际上需要提供实际链表的初始化
// 删除重复并打印结果
deleteDuplicates(head);
printList(head);
return 0;
}
```
记得在`main()`函数中提供链表的实际头节点。当你运行这个程序时,它会遍历链表,删除重复的数值,并仅保留一个。如果你想要在这个例子中插入用户输入的元素,你需要另外处理这部分。
阅读全文