/*
问题描述:删除单链表中绝对值重复的元素。如:(21,-15,-15,-7,15)->(21,-15,-7)
说明:其实这题比较好的思路还是以前说的,以空间换时间。还是以前说的分类,把归属于一类的当成一种情况(这里是绝对值相同的元素),看它们能不能有相同的容易被检测到操作,在这里是把辅助数组对应位置加1。这样的话,遍历一遍就可以完成问题,时间复杂度是O(N),普通的算法,来回重复遍历,复杂度是O(N2)。不过还是老问题,这里需要元素的绝对值的最大值不能太大因为这是辅助数组是根据元素绝对值的最大值申请空间的。
*/
//筛选链表中绝对值重复的元素
void FiltrateRep(LinkList &L)
{
int temp[MAXSIZE]; //辅助元素
memset(temp,0,sizeof(int)*MAXSIZE); //初始化为0
LNode *pre = NULL,*p =NULL ;
pre = L;
while(pre->next != NULL)
{
p = pre->next;
if( p!= NULL)
{
if(temp[abs(p->data)] < 1)
{
++temp[abs(p->data)]; //辅助数组对应元素位置+1
pre = p;
}
else //如果temp[p->data]大于1,正在判断的元素,是重复元素,需要删除
{
pre->next = p->next; //删除重复的元素
delete p;
}
}
}
}
总结:其实以前做顺序结构的线性表的时候,明明总结过这种思路,到这里又没想到,还是不能融会贯通。还得修炼啊。