任务描述
本关任务:利用单链表表示一个整数序列,实现一个时间复杂度为O(n)的算法,对于链表中绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。
例如,若给定的单链表HEAD如下:
删除后的单链表HEAD为:
编程要求
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,依次输出删除结点后的链表元素,元素之间用空格分隔。
测试说明
平台会对你编写的代码进行测试:
测试输入:
5
21 -15 -15 -7 15
7
90 32 -90 -66 77 66 90
0
预期输出:
21 -15 -7
90 32 -66 77
公主王子们请看代码:
void DeleteEqualNode(LinkList &L,int n)
{//删除链表中绝对值相等的结点
/**************begin************/
LNode *p,*q;
q=L;
p=L->next;
int a[100];
for(int i=1;i<=100;i++)
{
a[i]=0;//建立一个辅助数组
}
while(p)
{
if(a[Abs(p->data)]==0)
{
a[Abs(p->data)]=1;
p=p->next;
q=q->next;
}
else
{
LinkList t=p;
q->next=p->next;
p=p->next;
delete t;
}
}
/**************end************/
}
在遇见重复出现的数据时,我们也许可以考虑用辅助数组。这里用一个足够大的数组,并且将每个数组元素初始化为0。在while循环中历遍时,将指针所指数值的绝对值都作为数组下标,数组中每个先出现的新数下标的元素又再次赋值为1,等到下次出现下标绝对值一样的数组元素时就不再等于0了,代表之前已经出现过了,于是进入else语句中进行删除操作。(我的表达语言水平实在是不好,修修改改但是看起来还是很抽象,真是so sorry🥺)