删除链表中绝对值相等的结点

利用单链表表示一个整数序列,实现一个时间复杂度为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;
}

 

上一篇:单链表-删除并释放以L为表头指针的单链表的所有结点(双指针法)


下一篇:数据库结构笔记--线性表的合并