1.题目描述:
将一个递增有序的线性表中的重复元素删去。
2.基本思想:
1. 跳过重复元素: 利用*p指向最后一个不重复的指针,num记录最后一个不重复的data,当遇到重复元素时,L=L->next;当遇到不重复值时,p->next=L,num=L->data,p=L,L=L->next,更新相应信息。
2. 删除后继重复元素: 因为递增有序,重复元素逻辑上连在一起,因此每次遇到重复元素时,p->next=p->next->next,指向更后一位元素。
3.源代码
#include<stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void NoDuplicate1(LinkList &L){
// if(L->next==NULL) return;
// LNode *p=L->next;//记录最后一个不重复元素
// LNode *s=L->next;
// int num=p->data;//记录最后一个不重复元素的值
// s=s->next;
// while(s!=NULL){
// if(s->data!=num){
// p->next=s;
// num=s->data;
// p=s;
// s=s->next;
// }
// else{
// s=s->next;
// }
// }
if(L->next==NULL) return;
LNode *p=L->next;//记录最后一个不重复元素
LNode *s=L; //如果要基于原链操作,保存L的原指针
int num=p->data;//记录最后一个不重复元素的值
L=L->next->next;
while(L!=NULL){
if(L->data!=num){
p->next=L;
num=L->data;
p=L;
L=L->next;
}
else{
L=L->next;
}
}
L=s; //还原原指针
}
void NoDuplicate2(LinkList &L){
if(L->next==NULL) return;
LNode *p=L->next;
while(p!=NULL){
if(p->next!=NULL&&p->data==p->next->data){//如果与后一个元素的值相等,则删去后一个元素,同时使指针指向更往后一位元素
p->next=p->next->next;
}
else p=p->next;
}
}
int main(){
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *s = L;
int x;
scanf("%d",&x);
while(x!=0){
LNode *sdata=(LNode*)malloc(sizeof(LNode));
sdata->data=x;;
s->next = sdata;
s=sdata;
scanf("%d",&x);
}
s->next=NULL;
// NoDuplicate1(L);
NoDuplicate2(L);
while(L->next!=NULL){
L=L->next;
printf("%d",L->data);
}
return 0;
}