1. 程式人生 > >題目9  單鏈表中儲存M個整數,設計一個時間複雜度儘可能高效的演算法

題目9  單鏈表中儲存M個整數,設計一個時間複雜度儘可能高效的演算法

  • 單鏈表中儲存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