1. 程式人生 > >刪除單鏈表的冗餘值

刪除單鏈表的冗餘值

1004:刪除單鏈表的冗餘值

Time/Memory Limit:1000 MS/32768 K 
Submitted: 21 Accepted: 18

 Problem Description

給定一個有n個元素的單鏈表,若單鏈表中有相等元素則稱存在冗餘值,要求進行刪除操作,即使得單鏈表中不存在相等元素。

 Input

第一行為一個數字m,表示下面有m組資料,每組資料包括2行:第1行表示單鏈表的長度n(0<=n<=100,空表的輸入只有一行),第2行表示單鏈表的所有元素。

 Output

每組輸出佔一行,單鏈表的每兩個元素之間有一空格。輸出刪除冗餘元素後的單鏈表的所有元素(空表輸出一空行)。

 Sample Input

2
8
9 3 3 8 7 8 8 7
10
9 3 3 25 8 3 3 8 3 7

 Sample Output

9 3 8 7
9 3 25 8 7
#include<iostream>
#include<stdio.h>
const int MAX=21;
using namespace std;
class List {
public:
    struct node {
        int data;
        int count;
        node* next;
    };
    node* head;
public:
    List() {
        head=new node;
        head->next=NULL;
    }
    void Creat(int n) {

        node* r=head;
        for(int i=0; i<n; i++) {
            int num;
            cin>>num;
            node* s=new node;
            s->data=num;
            s->count=1;
            r->next=s;
            r=s;
        }
        r->next=NULL;
    }
    void Print() {
        node* p=head->next;
        if(p) {
            while(p->next) {
                cout<<p->data<<" ";
                p=p->next;
            }
            cout<<p->data<<endl;

        } else {
            cout<<endl;
        }
    }
    void DeleteRedudancyValue() {

        if(head->next==NULL||head==NULL) return;
        for(node* p=head->next; p!=NULL; p=p->next) {
            for(node* q=head->next; q&&q!=p; q=q->next) {
                if(p->data==q->data)
                    p->count++;
            }
        }

        node* pre=head;
        node* cur=head->next;
        while(cur) {
            if(cur->count>1) {
                node* s=cur;
                pre->next=cur->next;
                cur=cur->next;
                delete s;
            } else {
                pre=cur;
                cur=cur->next;
            }
        }
    }
};
int main() {
    int T;
    while(cin>>T) {
        while(T--) {
            int n;
            cin>>n;
            List list;
            list.Creat(n);
            list.DeleteRedudancyValue();
            list.Print();
        }
    }
    return 0;
}

方法二刪除:

void remove()
{
   node* newnode=head->next;
   while(newnode)
   {
       node* cur=newnode->next;
       node* pre=newnode;
       while(cur)
       {
           if(cur->data==newnode->data)
           {
                node* r=cur;
               pre->next=cur->next;
               cur=cur->next;
               delete r;
           }
           else
           {
               pre=cur;
               cur=cur->next;
           }
       }
       newnode=newnode->next;
   }
}