利用单链表表示一个整数序列,实现一个时间复杂度为O(n)的算法,对于链表中绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,依次输出删除结点后的链表元素,元素之间用空格分隔。
输入样例 1
5 21 -15 -15 -7 15 7 90 32 -90 -66 77 66 90 0
输出样例 1
21 -15 -7 90 32 -66 77
追求时间复杂度降低,所以采取空间换取时间的方式进行。
首先建立数组,初始化全为0;
对绝对值数将数组赋值为1;
例如,存在绝对值为22的数,则将a[22]赋值为1,表示已经存在了数为1 的数;
接下来用if判定就好
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define MAXSIZE 1000 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef struct LNode{ struct LNode *next; int num; }LNode,*LinkList; void Inist_List(LinkList& L){ L=new LNode; L->next=NULL; } void Zuhe(LinkList& L){ while(1){ int m; scanf("%d",&m); if(m==0) break; LinkList H=L; for(int i=0;i<m;i++){ LinkList p= new LNode; scanf("%d",&p->num); p->next=NULL; H->next=p; H=p; } H=L; LinkList pre=L,p=L->next; int *q=new int [10000],c; for(int i=0;i<10000;i++) *(q+i)=0; while(p){ c=abs(p->num); if(*(q+c)==0){ *(q+c)=1; pre=p; p=p->next; } else{ p=p->next; delete pre->next; pre->next=p; } } delete []q; while(H->next->next){ H=H->next; printf("%d ",H->num); } printf("%d\n",H->next->num); } } int main(){ LinkList L; Inist_List(L); Zuhe(L); return 0; }