题目描述:设A 和 B 是两个带头结点单链表,其中元素递增有序,设计一个算法从 A 和 B 中的公共元素产生 C,要求不破坏 A 和 B 的结点。
void Public(LinkList &A, LinkList &B) {
// 创建一个新的链表 C,并将其头节点的 next 指针设置为 NULL,表示新链表为空。
LinkList C = (LinkList)malloc(sizeof(LNode));
C->next = NULL;
// 初始化指针 r,用于在遍历过程中连接链表 C 的节点。r 指向链表 C 的头节点。
LNode *r = C;
// 初始化指针 pa,指向链表 A 的第一个节点。在后续的循环中,将遍历链表 A 中的每个节点。
LNode *pa = A->next;
// 进入外层的 while(pa) 循环,用于遍历链表 A。
while (pa) {
// 在内层的 while(pb && pb->data != pa->data) 循环中,遍历链表 B,查找与链表 A 中当前节点相同的节点。
LNode *pb = B->next;
while (pb && pb->data != pa->data)
pb = pb->next;
// 如果找到了相同的节点(pb != NULL),则创建一个新的节点 q,将其数据设置为当前节点的数据,并将其连接到链表 C 中。
if (pb != NULL) {
LNode *q = (LNode *)malloc(sizeof(LNode));
q->data = pa->data;
r->next = q;
r = q;
}
// 继续遍历链表 A 的下一个节点。
pa = pa->next;
}
r->next = NULL; //将 C 链表的尾指针置空
}