}
2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。
解:
void MergeList_L(LinkList &ha,LinkList &hb,LinkList &hc) { }
2.16 已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确?若有错,请改正之。
Status DeleteAndInsertSub(LinkedList la,LinkedList lb,int i,int j,int len) { } 解:
Status DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len)
if(i<0||j<0||len<0) return INFEASIBLE; p=la; q=p;
while(k<=len){ q=q->next; s=lb; k=1; while(knext=p; return OK;
s=s->next;
k++; }
q->next=s->next;
k++; }
k=1;
p=p->next;
k++; }
while(k
while(pa->next&&pb->next){ }
if(!pa->next){ } else{ }
hc=ha;
while(pa->next) pa=pa->next; pa->next=hb->next; hc=hb;
while(pb->next) pb=pb->next; pb->next=ha->next; pa=pa->next; pb=pb->next; }
return i;
i++;
{ }
2.17 试写一算法,在无头结点的动态单链表上实现线性表操作Insert(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
2.18试写一算法,实现线性表操作Delete(L,i),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
2.19 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有
LinkList p,q,s,prev=NULL; int k=1;
if(i<0||j<0||len<0) return INFEASIBLE; // 在la表中查找第i个结点 p=la;
while(p&&k
if(!p)return INFEASIBLE; // 在la表中查找第i+len-1个结点 q=p; k=1; while(q&&kif(!q)return INFEASIBLE;
// 完成删除,注意,i=1的情况需要特殊处理 if(!prev) la=q->next; else prev->next=q->next;
// 将从la中删除的结点插入到lb中 if(j=1){ } else{ }
return OK;
s=lb; }
if(!s)return INFEASIBLE; q->next=s->next; s->next=p; //完成插入
k=1;
while(s&&ks=s->next; k++; q->next=lb; lb=p; q=p->next; k++; prev=p; p=p->next; k++;