删除给定链表中的重复元素(链表中元素从小到大有序排列),使链表中的所有元素都只出现一次 例如: 给定的链表为1->1->2,返回1->2 给定的链表为1->1->2->3->3,返回1->2->3 数据范围:链表长度满足 0≤n≤100,链表中任意节点的值满足 ∣val∣≤1000 要求:空间复杂度 O(1),时间复杂度 O(n) 输入描述 一行内输入一串整数,以空格间隔,以# 结束。 输出描述 一串去重后整数,以空格间隔,以#结束。使用C语言实现
时间: 2024-02-13 07:05:36 浏览: 64
好的,这里是使用双指针来删除链表中的重复元素的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 删除重复元素函数
struct ListNode* deleteDuplicates(struct ListNode* head){
if (!head || !head->next) {
return head;
}
struct ListNode *p1 = head, *p2 = head->next;
while (p2) {
if (p1->val == p2->val) {
p2 = p2->next;
} else {
p1->next = p2;
p1 = p2;
p2 = p2->next;
}
}
p1->next = NULL;
return head;
}
int main() {
// 读入链表
int val;
struct ListNode *head = NULL, *p = NULL;
scanf("%d", &val);
while (val != -1) {
if (!head) {
head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = val;
head->next = NULL;
p = head;
} else {
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
p->next = node;
p = node;
}
scanf("%d", &val);
}
// 删除重复元素
head = deleteDuplicates(head);
// 输出去重后的整数
p = head;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("#\n");
return 0;
}
```
输入样例:
```
1 1 2 -1
```
输出样例:
```
1 2 #
```
输入样例:
```
1 1 2 3 3 -1
```
输出样例:
```
1 2 3 #
```
阅读全文