c语言--力扣简单题目(删除排序链表中的重复元素)讲解

题目如下:

给定一个已排序的链表的头 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指针指向下一个节点。

当退出循环后我们再进行打印就可以了。

相关推荐
皮皮哎哟12 小时前
数据结构:从队列到二叉树基础解析
c语言·数据结构·算法·二叉树·队列
一匹电信狗12 小时前
【高阶数据结构】并查集
c语言·数据结构·c++·算法·leetcode·排序算法·visual studio
进击的小头12 小时前
设计模式组合应用:传感器数据采集与处理系统
c语言·设计模式
日拱一卒——功不唐捐12 小时前
01背包(C语言)
c语言
Hello World . .12 小时前
数据结构:二叉树(Binary tree)
c语言·开发语言·数据结构·vim
WBluuue12 小时前
数据机构与算法:dp优化——倍增优化
c++·算法·leetcode·动态规划
范纹杉想快点毕业12 小时前
嵌入式实时系统架构设计:基于STM32与Zynq的中断、状态机与FIFO架构工程实战指南,基于Kimi设计
c语言·c++·单片机·嵌入式硬件·算法·架构·mfc
近津薪荼13 小时前
递归专题(2)——合并链表
c++·学习·算法·链表
圣保罗的大教堂13 小时前
leetcode 3013. 将数组分成最小总代价的子数组 II 困难
leetcode
划破黑暗的第一缕曙光13 小时前
[数据结构]:6.二叉树链式结构的实现2
c语言·数据结构·二叉树