有序单链表去重

根据程序提供的LNode结构,删除以h为头结点的有序单链表中的重复元素,并返回删除的元素构成的新单链表(保持原来表中的相对顺序)。

函数接口定义:

LNode* DelR(LNode *h);

其中h为无附加表头的单链表的首结点地址。要求函数删除单链表中的重复元素,并将删除的元素构成新链表返回(当然是表头结点地址)。
裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include “stdio.h”
#include “stdlib.h” typedef int dataType; typedef struct node{
dataType data;
struct node next; } LNode; LNode _LNodeN(int n);//测试函数提供的:初始化无附加表头的单链表的函数 void outputL(LNode
*h);//测试函数提供的:输出无附加表头的单链表的函数

LNode* DelR(LNode *h);//删除以h为首结点地址的链表中的重复元素,并将删除的元素构成新链表返回

int main(){
int n;scanf("%d",&n);
LNode *H=_LNodeN(n);
outputL(H);
LNode *DH=DelR(H);
outputL(H);outputL(DH);
return 0; }

/* 请在这里填写答案 */

输入样例:
一个整数:随机种子,用来产生待处理的链表。

79

输出样例:
第一行是待处理的有序链表。第二行是去重后的链表。第三行被删除的元素构成的链表。

{14,14,15,16,16,17,17,17,17}
{14,15,16,17}
{14,16,17,17,17}

思路
设置一前一后两个链表指针,若是后指针的数==前指针的数,先保存后指针的数据,进行新链表插入,再删除此节点。
代码展示

LNode* DelR(LNode *h){
    if(h == NULL) return NULL;//一定要有这步,判断是否为空,有测试点设置
    LNode *p1 = h, *p2 = h->next;
    LNode *head, *tail, *p;
    head = (struct node*) malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    while(p2){
        if(p2->data == p1->data){
            //插入新链表
            p = (struct node*) malloc(sizeof(struct node));
            p->data = p2->data;
            tail->next = p;
            tail = p;
            
            //删除
            p1->next = p2->next;
            free(p2);
        }else p1 = p2;
        p2 = p1->next;
    }
    tail->next = NULL;
    return head->next;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值