题目描述:
已知 递增的 有序的 单链表 ,A、B(A、B中的元素分别为m、n,且AB均带有头结点)分别存储了一个集合,请设计算法以求出两个集合A、B的差集A-B,并将差集保存在A中,保持元素的递增有序性;
实现思路:
只需要从A中删除B中重复的元素即可。
由于两个链表都是有序的,所以可以:
设置两个指针p,q在开始时分别指向A、B的开始结点,然后循环进行比较;
当p指向的结点大于q指向的结点即 p->data >q->data 的时候,q的指针后移,反之则p的指针后移(p->data < q->data),二者相等时删除A中的元素(p结点);
当p或者q指向NULL时算法结束。
代码实现:
void diffence(LNode *A,LNode *B)
{
LNode *p = A->next,*q = B->next; //p和q是两个辅助指针
LNode *pre = A; //pre为A中p所指结点的前驱结点的指针
Lnode *r;
while(p!=NULL && q!=NULL)
{
if(p->data < q->data)
pre = p; //A链表中指针后移
p = p->next;
else if(p->data > q->data)
q = q->next; //A链表中指针后移
else
pre->next = p->next; //删除重复元素
r = p;
p = p->next;
free(r); //链表的结点空间需手动释放
}
}
题目收获:
1.链表中的结点需要手动free,顺序表则不需要;
2.双指针思想;
3.注意审题;
4.指针pre设置是用来找到当前要删除结点的前驱结点,指针r用来释放该结点(删除);