** 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();
}
}