题目:
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
思路:
遍历链表A一次,遍历链表B多次。
时间复杂度:
O(n1*n2)
实现如下:
struct node
{
int elem;
node* next;
};
void difference(node** LA, node* LB)
{
node *pa, *pb, *pre, *q;
pre = NULL;
pa = *LA;
while (pa)
{
pb = LB;
while (pb&&pb->elem!=pa->elem) //2
pb = pb->next;
if (pb) //3
{
if (!pre)//要删除的是第一个结点
*LA = pa->next; //4
else
pre->next= pa->next; //5
q = pa;
pa = pa->next;
free(q);
}
else
{
pre = pa; //6
pa = pa->next;
}
}
}