题目9  单链表中保存M个整数,设计一个时间复杂度尽可能高效的算法

版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/83217707
  • 单链表中保存M个整数,设计一个时间复杂度尽可能高效的算法,对于链表中绝对值相等的元素(|data|<n),只保留第一次出现的节点,删除其余的节点。如:15->(-3)->(-15)->3  得:15->(-3) 

思想:

    算法的核心思想是用空间换时间,用辅助数组来记录链表中已经除权的数值,从而对链表扫描的时候,进行存在性判断。

辅助数组:由于|data|<n 故而采用辅助数组的大小是n+1

方式一:用固定数组,空间系统释放
void remove_elem_1(Node *&n, int k){
	int flag[k+1] = {0};            //初始化全为0元素
	Node *p = n->next, *pre=n, *r;
	while(p!=NULL){
		int value = p->num>0?p->num:-1*p->num;
		if(flag[value-1]==0){
			flag[value-1] = 1;   //数值从0-n刚好对应其数组的下标
			pre = p;
			p=p->next;
		}else{
			r = p;
			p = p->next;
			pre->next = p;
			free(r);
		}
	}
}
方式二:使用动态申请,动态释放数组
void remove_elem2(Node *&n, int k){
	int *flag = (int*)malloc(sizeof(int)*(k+1));
	for(int i=0;i<k+1;i++){
		*(flag+i)=0;
	}
	Node *p = n->next, *pre=n, *r;
	while(p!=NULL){
		int value = p->num>0?p->num:-1*p->num;
		if(flag[value-1]==0){
			flag[value-1] = 1;
			pre = p;
			p=p->next;
		}else{
			r = p;
			p = p->next;
			pre->next = p;
			free(r);
		}
	}
	free(flag);
}

作者:无涯明月

发文时间:2018-10-20  

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/83217707