6-13 单链表去重*

已知单链表的结点结构定义如下:

typedef struct _NODE_
{
    int data;
    struct _NODE_ *next;
} NODE;

说明:data 为数据域。next 为指针域,指示后继结点。

请编写函数,删除带附加头结点的单链表中重复的数据结点。

函数原型

void Unique(NODE *head);

说明:参数 head 为单链表的头指针,函数将对单链表作去重处理:每个数据结点只保留第 1 个,后面与之重复的数据结点都被删去。

裁判程序

int main()
{
    NODE *h;
    Create(&h);
    Input(h);
    Unique(a);
    Output(a);
    putchar('\n');
    Destroy(&a);
    return 0;
}

说明:Create 函数用于创建链表,Destroy 函数用于销毁链表。Input 函数用于输入链表:首先输入结点数,然后输入这些数据元素。Output 函数用于输出单链表,数据元素之间以空格间隔。

输入样例

16
28 47 52 28 36 47 52 47 28 28 95 47 36 28 47 95

输出样例

28 47 52 36 95

要求:时间复杂度为 O(n2),空间复杂度为 O(1)。

函数:

void Unique(NODE *head){
    NODE * T=head;//从T指针开始逐个进行操作
    NODE * P;//创建P指针
    for(T=head->next;T;T=T->next){//因为head有头结点,所有操作从首元节点开始
        NODE *pre=T;//pre从开始T指针操作
        for(P=T->next;P;P=P->next){//保证T和P不相同(T和pre也不相同)
            if(T->data==P->data){
                pre->next=P->next;//删除重复的元素
            }else
            pre=P;//保证pre在P的前面
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值