题目
用单链表保存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--;
}
}
}
该博客介绍了如何设计一个高效算法来删除单链表中绝对值相等的重复结点。通过使用辅助数组记录每个数据值出现的次数,当发现某个结点的数据值在数组中计数达到2时,删除该结点。整个过程的时间复杂度被优化,确保了链表操作的效率。

被折叠的 条评论
为什么被折叠?



