链表(三)
15.已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于
A链表中。
问题思路:归并思想。结果链生成采用尾插法。
LinkList Union(LinkList & la, LinkList & lb) {
LNode* u;
pa = la->next;
pb = lb->next;
pc = la; //结果链
while (pa && pb) {
if (pa->data = pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
u = pb;
pb = pb->next;
free(u);
}
else if(pa->data<pb->data) {
u = pa;
pa = pa->next;
free(u);
}
else {
u = pb;
pb = pb->next;
free(u);
}
}
//释放剩余的一个链表
while (pa) {
u = pa;
pa = pa->next;
free(u);
}
while (pb) {
u = pb;
pb = pb->next;
free(u);
}
pc->next = NULL;
free(lb);
return la;
}
16, 两个整数序列A - a, a, a, ., a和B = b, 2, bs, .b已经存入两个单链表中, 设计一个算法,
判断序列B是否是序列A的连续子序列。
思想:A链表需要设置一个前驱节点(不设置也可)
int Pattern(LinkList A, LinkList B) {
LNode* p=A;
LNode* q=B;
LNode* pre = p;
while (p && q) {
if (p->data == q->data) {
p = p->next;
q = q->next;
}
else {
pre = pre->next;
p = pre;
q = B;
}
}
if (q == NULL)
return 1;
else
return 0;
}
17.设计一个算法用于判断带头结点的循环双链表是否对称
int Symmtry(DLinkList L) {
DNode* p = L->next, * q = L->prior;
while (p != q && q->next != p) { //考虑链表的奇偶
if (p->data == q->data) {
p = p->next;
q = q->prior;
}
else
return 0;
}
return 1;
}
18.有两个循环单链表, 链表头指针分别为h1和h2, 编写一个函数将链表h2链接到链表hl之后,要
求链接后的链表仍保持循环链表形式。
思想:找到尾指针即可
LinkList Link(LinkList& h1, LinkList& h2) {
LNode* p, * q;
p = h1;
while (p->next != h1) {
p = p->next;
}
q = h2;
while (q->next != h2) {
q = q->next;
}
p->next = h2;
q->next = h1;
return h1;
}
19, 设有一个带头结点的循环单链表, 其结点值均为正整数。设计一个算法, 反复找出单链表中结
点值最小的结点并输出, 然后将该结点从中删除, 直到单链表空为止, 再删除表头结点。
void Del_Small(LinkList& L) {
LNode* p, * pre, * minp, * minpre;
while (L->next != L) {
p = L->next; pre = L;
minp = p; minpre = pre;
while (p != L) {
if (minp->data > p->data) {
minpre = pre;
minp = p;
}
pre = p;
p = p->next;
}
minpre->next = minp->next;
free(minp);
}
free(L);
}