C语言每日一题(44)删除排序链表中的重复元素 II

算法入门15】删除链表中重复的结点 核心考点:链表操作,临界条件检查,特殊情况处理 在一个排序链表中,存在重复的结点,请删除链表中重复的结点,重复的结点不保留,返回链表头指针。 阅读详情

力扣 82 删除排序链表中的重复元素 II

题目描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

思路分析

一次遍历即可,题目所给的链表已经升序排列好了,那如果有重复元素的话他一定是放在一起的,也就是连续的,所以我们从头结点和它的下一个开始,如果相等的话,我们就将后面的链表向前移动进行覆盖实现删除,直到两个不等时继续遍历到链表结束。

为了方便扫描所有结点的值,我们定义一个哨兵位,从哨兵位开始遍历,返回时指向哨兵位的下一位就是头结点了。

struct ListNode* deleteDuplicates(struct ListNode* head) {
    struct ListNode* dummy=(struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->val=0;
    dummy->next=head;
    struct ListNode* cur=dummy;
    if(!head)
    {
        return head;
    }
    while(cur->next&&cur->next->next)//两者不为空
    {
        if(cur->next->val==cur->next->next->val)
        {
            int x=cur->next->val;//保留它们相等的值
            while(cur->next&&cur->next->val==x)//如果cur的下一个的值等于刚刚保留的x,就删,直到next的值不等于x就停下
            {
                cur->next=cur->next->next;//进行删除,将next的next赋给next实现覆盖删除
            }
        }
        else
        {
            cur=cur->next;
        }
    }
    struct ListNode* ans=dummy->next;
    free(dummy);//记得释放
    return ans;
}

C语言 链表 数据结构实验之链表七:单链表重复元素删除 数据结构实验之链表七:单链表重复元素删除 Problem Description 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。 Input 第一行输入元素个数 n (1 第二行输入 n 个整数,保证在 int 范围内。 Output 第一行输出初始链表元素个数; 第二行输出按照 阅读详情

相关推荐

删除重复元素(顺序表、单链表

一、顺序表删除重复元素 二、删除带头结点的单链表中值重复的元素 三、单链表字符统计

AIGC 6480

删除链表重复元素(c语言版)

输入一组数字,换行,输入要删除的元素,输出删除后的元素和元素个数。若输入字母,浮点型数据可判错。

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1131

删除相同元素(c语言

删除相同元素描述格式样例题解及详细注释 描述 给定一个长度为n(n≤10000)的非递减序列a,删除其中所有的重复元素,得到一个严格单调递增序列。 格式 输入格式 输入数据为两行,第一行是整数n,第二行是n个整数组成的非递减序列 输出格式 输出去掉重复元素之后得到的严格单调递增序列 样例 输入样例 10 1 1 3 6 6 7 7 7 12 12 输出样例 1 3 6 7 12 题解及详细注释 #include<stdio.h> #include <stdlib.h> int mai

m0_51456787的博客 3194

给定一个排序链表删除重复数字的节点(1:删除重复的;2删除所有的)

1.给定一个排序链表删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 程序如下: /* * 解题思路: * 用两个指针,一个指针current记录当前不重复的位置,index记录重复的位置,index指针...

qfc8930858的博客 1116

C语言每日一题(45)删除排序链表中的重复元素

有了44题的基础,这道题简直易如反掌。基于44题的思路,我们这次直接从头结点和它的下一个结点开始扫描,连哨兵位也不用定义。这题不同的点在于重复的元素至少要保留一个,所以扫描时如果下一个结点的值等于当前结点的值,我们就从下一个结点开始删,直到值不等时,继续遍历。删除所有重复的元素,使每个元素只出现一次。给定一个已排序链表的头。

wcl312的博客 683

删除排序链表中的重复元素 II(C语言实现)

第三步,第一种情况下主逻辑为一个变量遍历到下一个不同的节点,另一个变量依次删除节点,第三个变量则链接链表删除链表重复元素可以使用对比的方法,前后两个元素进行对比,两个元素相同就进行删除,不同就继续遍历。第二步,第一种情况下为要删除的情况,需要删除,之后再链接;第二种为不同的情况,需要继续遍历寻找。第一步,分为两种情况,第一种为两个节点相同的情况,第二种时两个节点不同的情况。第四步,存在特殊情况,分为头删和尾删、全部删除,这三个需要注意野指针的问题。第五步,删除完成后返回链表头指针。

2401_83440536的博客 415

leetcode-83-删除排序列表中的重复元素-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 题目数据保证链表已经按升序排列 思路: 步骤一:判断NULL是否为空。 步骤二:用t_head和t两个指

weixin_43049614的博客 205

C语言-顺序表直接删除重复元素

今天想把之前的合并后的单链表中重复的元素删去,结果在一个函数中,竟然不可以直接调用delete函数,似乎是传值出现的问题,已经在主函数中将LC传值到delete_repeatnum,在delete_repeatnum中再传值到delete函数就不行了。 出现了如下错误: 最后只好采用笨办法,直接在delete_repeatnum函数中重复删除步骤,但还是小有遗憾,希望有大佬看到后可以提点一下,拜托拜托~ 改正的方法如下: void delete_repeatnum(SeqList *L) {

weixin_56988709的博客 5004

C语言删除数组中的重复元素(详细分析版)

//给数组删除重复的元素 #include<stdio.h> #define N 12 int main(){ int a[N] = { 1, 1, 2, 3, 3, 4, 6, 4, 8, 6,9,8}; int i = 0, j = 0, n = N; //n个数比较n-1次 printf("==========去重之前=========\n"); for (i = 0; i < n; i++){ printf("%d ", a[i]); } for (i = 0;.

m0_56398287的博客 1万+

删除数组中相同元素(C语言)

删除数组中的相同元素(C语言实现)1.思路一:遍历数组每一个元素,然后再遍历该元素之后的元素,若没有相同的,则该元素不被删去,可以将它存在另一数组中(这里,逻辑上可以将原数组看作两个数组,一会看代码)#include &lt;stdio.h&gt; int del_same(int date[],int n); int del_same(int date[],int n) { int ...

qq2071114140的博客 4万+

C语言-删除递增有序线性表中的重复元素

1.题目描述: 将一个递增有序的线性表中的重复元素删去。 2.基本思想: 1. 跳过重复元素: 利用*p指向最后一个不重复的指针,num记录最后一个不重复的data,当遇到重复元素时,L=L->next;当遇到不重复值时,p->next=L,num=L->data,p=L,L=L->next,更新相应信息。 2. 删除后继重复元素: 因为递增有序,重复元素逻辑上连在一起,因此每次遇到重复元素时,p->next=p->next->next,指向更后一位元素。 3.源代

yearling的博客 1836

删除排序链表中的重复元素(C语言

删除排序链表中的重复元素(C语言

Butayarou的博客 5123

leetcode刷刷题(37) ---- 删除排序链表中的重复元素(C语言版)

2020-2-19 Don’t get all sad-faced about what happened and scrunchy-faced about what could. 不为已经发生的事而悲伤,也不为没发生的事而苦恼。 题目: 给定一个排序链表删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入...

Eureka1024的博客 987

c语言——删除链表中的重复元素

适应类型:删除的元素不相邻。 每次都需要从 链表头 遍历到 链表尾,去寻找重复元素。 用双层循环去实现,外层循环遍历链表,内层循环将 当前结点的值 与 剩余的所有结点的值 比较 如果有相同的就删除 同时 把删除结点的 前 后 两个节点连接起来。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct NUM {//定义一个结构体 int num; struct NU

qq_46280302的博客 5067

c语言删除数组中的重复元素

初始代码,可根据自己的需求进行修改 #include<stdio.h> int removeDuplicates(int *nums,int numsSize); int main(){ // 初始化数组 int num[5] = {1,1,1,1,1}; int length = removeDuplicates(num,5); // 打印数组长度 printf("%d\n",length); // 遍历数组 for(int i=0;i<length;i++){ pri

Futureing的博客 5188

删除链表重复元素 C语言

题目描述: 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。 返回同样按升序排列的结果链表。 示例: 输入:head = [1,1,2] 输出:[1,2] 输入:head = [1,1,2,3,3] 输出:[1,2,3] 解题思路: 先判断链表是否为空。 让指针p指向表头,判断p->next->val是否和p->val 相等,相等就修改p->next,不相等就让指针p后移。 struct ListNode* delete

hhh809434255w的博客 1218

删除重复数据元素c语言,设计算法删除顺序表中重复的数据元素,并转换为程序上机实现...

该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include "stdafx.h"#include #include void delete_same(int *a,int *len){int i,j,k;for(i=0;ifor(j=i+1;jif(a[i] != a[j]) continue;/*如果没有找到相等的元素,则继续查找*/for(k=j;ka[k] = a[k+1];}--j; ...

weixin_30823465的博客 939
上一篇: C语言每日一题(43)旋转链表
下一篇: C语言每日一题(45)删除排序链表中的重复元素
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对编程一片赤诚的小吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值