DS单链表—删除重复元素

** DS单链表—删除重复元素**
题目描述

给定n个整数,按输入顺序建立单链表,删除其中的重复数字,输出结果链表。(要求不可以构建新结点,不可以定义新链表。在原链表上删除。)

输入

测试次数t

每组测试数据一行:

n(表示有n个整数),后跟n个数字

输出

对每组测试数据,输出删除重复数字后的结果链表表长和每个元素,具体格式见样例。

输入:

3
10 1 2 3 4 1 2 10 20 30 20
5 1 1 1 1 1
6 20 22 22 22 22 20
输出:
7: 1 2 3 4 10 20 30
1: 1
2: 20 22
在这里插入图片描述

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class Node{
public:
    int date;
    Node* next;
    Node(int a=0){
        date=a;
        next=NULL;
    }
};
class List{
    int num;
    Node* head;
public:
    List(int n):num(n){
        head=new Node;
        Node*p=head;
        for(int i=0;i<num;i++){
            int a;
            cin>>a;
            p->next=new Node(a);
            p=p->next;
        }
    }
    ~List(){
        Node*head1=head;
        Node*p;
        while(head1->next){
            p=head1->next;
            delete head1;
            head1=p;
        }
        delete head1;
    }
    void test(){
        Node*p1=head;
        while(p1->next){
            delete_t(p1->next);
            p1=p1->next;
        }
    }
    void delete_t(Node*p1){
        Node*p2;
        Node*p3;
        if(!p1->next) return;
        int a=p1->date;
        while(p1->next){
            p2=p1->next;
            p3=p2->next;
            if(p2->date==a){
                delete p2;
                num--;
                p1->next=p3;
            }
            else{
                p1=p1->next;
            }
        }
    }
    void print(){
        Node*head1=head;
        cout<<num<<": ";
        if(!head1->next->next){
            cout<<head1->next->date;
            return;
        }
        while(head1->next->next){

            cout<<head1->next->date<<" ";
            head1=head1->next;
        }
        cout<<head1->next->date;
        }
};
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        List list1(n);
        list1.test();
        list1.print();
        if(t!=0) cout<<endl;
    }
}

第二种答案

#include<iostream>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
struct Node{
    int date;
    Node* next;
    Node(int a=0):date(a),next(NULL){}
};
class List{
    Node*head;
    int num;
public:
    List(int a){
        num=a;
        head=new Node;
        Node*p=head;
        int n;
        for(int i=0;i<a;i++){
            cin>>n;
            p->next=new Node(n);
            p=p->next;
        }

    }
    void test(){
        Node*p=head->next;
        while(p->next){

            Node*p2=p;
            Node*p3=p->next;
            while(p3){
                if(p->date==p3->date){


                    p2->next=p3->next;
                    delete p3;
                    num--;
                    p3=p2->next;
                }
                else{
                    p2=p3;
                    p3=p3->next;
                }
            }
            p=p->next;
            if(!p) break;//很关键,可能p变成了最后一个节点,再p->next会出问题
        }

    }
    void display(){
        cout<<num<<": ";
        Node*p=head->next;
        for(int i=0;i<num;i++){
            cout<<p->date<<" ";
            p=p->next;
        }
        cout<<endl;
    }

};
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        List list1(n);
        list1.test();
        list1.display();
    }
}

可以一边建立链表一边进行查重操作,不知道符不符合题目要求

#include<iostream>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
struct Node{
    int date;
    Node* next;
    Node(int a=0):date(a),next(NULL){}
};
class List{
    Node*head;
    int num;
public:
    List(int a){
        num=a;
        head=new Node;
        Node*p=head;
        int n;
        for(int i=0;i<a;i++){
            cin>>n;
            if(test(n)){
                 p->next=new Node(n);
                 p=p->next;
            }
            else{
                num--;
            }
        }

    }
    int test(int a){
        Node*p=head->next;
        int b;
        while(p){
            b=p->date;
            if(a==b) return 0;
            p=p->next;
        }
        return 1;

    }
    void display(){
        Node*p=head->next;
        cout<<num<<": ";
        for(int i=0;i<num;i++){
            cout<<p->date<<" ";
            p=p->next;
        }
        cout<<endl;
    }

};
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        List list1(n);
        list1.display();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值