题目
用单链表保存m个整数,结点的结构为:[data][link],且|data|≤n(n为正整数)。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。例如,若给定的单链表head如下:
则删除结点后的head为:
题解
分析
第三次考察带头结点的单链表。
1、查找出绝对值相等的结点
利用辅助数组,类似2013年的算法题,因为data≤n,故用元素值作为辅助数组下标。
并且需要n+1个辅助空间。
2、链表删除结点
删除链表L中第i个结点
void delete(Linklist L, int i){
//创建指针指向第i个结点的前驱节点
LNode *p = L->next;
int j=0;
while(j<i){
p=p->next;
j++;
}
//删除第i个结点
LNode *q = p->next; //q指向第i个结点
p->next=q->next;
free(q);
}
代码
void deleteSame(Linklist L){
int *a = (int *)malloc((n+1)*sizeof(int))
LNode *p = L->next;
int j=0;
while(p!=NULL){
j++;
p=p->next;
a[p->data]++;
if(a[p->data]==2){
a[p->data]--;
delete(L, j);
j--;
}
}
}