Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
Input
第一行输入元素个数 n (1 <= n <= 15);
第二行输入 n 个整数,保证在 int 范围内。
Output
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
Sample Input
10
21 30 14 55 32 63 11 30 55 30
Sample Output
10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21
Hint
Source
不得使用数组!
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}*LinkList,LNode;
LinkList createLinkList(LinkList &head,int n){
LNode *tail,*p;
head =tail = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
tail = head;
tail->next = NULL;
for (int i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->next = NULL;
scanf("%d",&p->data);
p->next = tail->next; //顺序不能错
tail->next = p;
}
return head;
}
void display(LinkList p){
p=p->next;
while(p){
if (p->next)
{
printf("%d ",p->data);
}else{
printf("%d\n",p->data);
}
p = p->next;
}
}
void deleteSameData(LinkList &L,int n){
LNode *p = L->next,*q,*r;
int count = 0;
q = p;
while(p){
while(q->next){
if (p->data == q->next->data) //p为当前元素 r为p以后的任意结点 q为r的前驱
{//如果当前结点q和r(q->next)值相等, 找到第
r = q->next;
q->next = r->next;
count++;
free(r);
}else{
q=q->next;
}
}
p=p->next;
q = p;
}
printf("%d\n",n-count);
display(L);
}
int main(){
int n;
scanf("%d",&n);
LinkList linklist = NULL;
createLinkList(linklist,n);
printf("%d\n",n);
display(linklist);
deleteSameData(linklist,n);
return 0;
}