题目描述:
链表中保留第一次出现的结点删除其余绝对值相等的结点
算法思想:
1.暴力。2.辅助数组
核心代码:
/*
L->21->-15->15->-7->15
r
L->NULL
p
21->-15->15->-7->15
*/
//这个方法是把头结点摘掉,依次把符合题目要求的结点插入L中。
//每次插入都遍历一下L表,看看当前要插入的结点是否与L中的结点有绝对值相同的情况,有就不插入
void del(LNode* &L)
{
// LNode *p=(LNode*)malloc(sizeof(LNode));
// p=L->next;
LNode *p=L->next;
L->next=NULL;
LNode *r=L;
bool flag=true;
while(p!=NULL)
{
LNode* r_p=p->next;
LNode* q=L->next;//q如果是空怎么办
while(q!=NULL)
{
flag=true;
if(p->data==q->data||p->data==-(q->data))
{
flag=false;
break;//直接break还是会进行插入元素操作
}
q=q->next;
}
if(flag==true)
{
r->next=p;
r=r->next;
r->next=NULL;//忘记这句,前面遍历while(q!=NULL)的时候就会出问题
//但是这句令p->next=NULL了
}
//p=p->next;
p=r_p;//不能是p=p->next,上面的if语句会把p->next的指向操作掉
}
r->next=NULL;
}
/* preq
p q
L->21->21->15->21->15
p preq q
L->21->15->21->15
p preq q
L->21->15->15
看看后序链表有没有与当前结点P->data绝对值相等的值
*/
void del_2(LNode* &L)
{
LNode *p,*q,*preq;
p=L->next;
while(p!=NULL)
{
preq=p;
q=p->next;
while(q!=NULL)
{
if(p->data==q->data||p->data==-(q->data))
{
LNode* temp=q;
preq->next=q->next;
q=q->next;
free(temp);
}
else//忘记加这个else了
{
preq=q;
q=q->next;
}
}
p=p->next;
}
}
//这个是答案给的以空间换时间的方法。使用辅助数组记录链表中已出现的数值,只进行一趟扫描
void del_3(LNode* &L,int n)
{
int *q=(int*)malloc((n+1)*sizeof(int));
for(int i=0;i<n+1;i++)
{
q[i]=0;
}
LNode* pre=L;
LNode* p=L->next;
while(p!=NULL)
{
int m=p->data;
if(q[m]==0)//首次出现
{
q[m]=1;//没加这个
pre=p;
p=p->next;
}
else
{
LNode* temp=p;
pre->next=p->next;
p=pre->next;
free(temp);
}
}
}