已知集合A和B的元素分别用不含头结点的单链表存储,请求集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
void saveDifWith2List(LNode** p, LNode** q) {
if (!*p && !*q) {
return;
}
if (!*p || !*q) {
*p = *q ? *q : *p;
return;
}
LNode* aprev = NULL;
LNode* anext = *p;
LNode* bnode = *q;
while (anext && bnode) {
if (anext->data < bnode->data) {
aprev = anext;
anext = anext->next;
} else if (anext->data == bnode->data) {
if (aprev) {
LNode* node = anext;
aprev->next = anext->next;
anext = aprev->next;
free(node);
} else {
LNode* node = anext;
*p = anext->next;
anext = *p;
free(node);
}
bnode = bnode->next;
} else {
if (!aprev) {
LNode* node = bnode->next;
bnode->next = anext;
aprev = bnode;
bnode = node;
} else {
LNode* node = bnode->next;
aprev->next = bnode;
aprev = bnode;
bnode->next = anext;
bnode = node;
}
}
}
if (!anext && bnode) {
aprev->next = bnode;
}
}