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

  • 单链表中保存M个整数,设计一个时间复杂度尽可能高效的算法,对于链表中绝对值相等的元素(|data|(-3)->(-15)->3  得:15->(-3) 

思想:

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

辅助数组:由于|data| 故而采用辅助数组的大小是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;inext, *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  

你可能感兴趣的:(数据结构,数据结构习题刷题)