題目9 單鏈表中儲存M個整數,設計一個時間複雜度儘可能高效的演算法
阿新 • • 發佈:2018-11-17
-
單鏈表中儲存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