题目如下:
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2] 输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
结构体定义:
typedef struct Node {
char val;
struct Node* next;
}Node;
typedef Node* List;
文章目录
第一部分
List head, tail;
Node* p, * p1;//p1用来删除节点
p = (Node*)malloc(sizeof(struct Node));
p1 = (Node*)malloc(sizeof(struct Node));
int ch, val;
head = p;
tail = p;
head->next = NULL;
printf("请输入链表的内容");
while ((ch = getchar()) != '\n') {
if (ch == ' ') {
continue;
}
p = (Node*)malloc(sizeof(struct Node));
p->val = ch-48;
tail->next = p;
tail = p;
tail->next = NULL;
}
第一部分进行输入。
第二部分
tail = head->next;//让tail指向存储数据的第一个节点
while (tail->next != NULL) {
if (tail->next->val == tail->val) {
p1 = tail->next;
tail->next = p1->next;
free(p1);
}
else {
tail = tail->next;
}
}
while (head->next != NULL) {
head = head->next;
printf("%d ", head->val);
}
return 0;
第二部分我们先让tail指针指向第一个节点,因为题目已经是按升序排序好,所以我们这里不需要进行排序,我们将当前的节点储存的值与下一个节点储存的值进行比较,如果相等,那么我们进行删除操作,如果不相等,那么我们让tail指针指向下一个节点。
当退出循环后我们再进行打印就可以了。