已知单链表的结点结构定义如下:
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的前面
}
}
}