1、有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,a3,b3…an,bn),設計一個算法將其拆分爲兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3,a4…an),L2=(bn,…b3,b2,b1),要求L1使用L的頭節點。
解:利用原單鏈表L中的所有結點通過改變指針域重組成兩個單鏈表L1和L2。由於L1中結點的相對順序與L中的相同,所以採用尾插法建立單鏈表L1;由於L2中結點的相對順序與L中的相反,所以採用頭插法建立單鏈表L2。代碼如下:
void split(LinkNode * &L,LinkNode * &L1,LinkNode * &L2)
{
LinkNode *p=L->next,*q,*rl; //p指向第一個數據結點
L1=L;
rl=L1; //rl始終指向L1的尾結點
L2=(LinkNode *)malloc(sizeof(LinkNode)); //創建L2的頭結點
L2->next=NULL;
while(p!=NULL)
{
rl->next=p; //採用尾插法將p插入到L1中
rl=p;
p=p->next;
q=p->next;
p->next=L2->next; //採用頭插法將結點p插入L2中
L2->next=p;
p=q; //重定位
}
rl->next=NULL;
}
2、設計一個算法,刪除一個單鏈表L中元素值最大的結點(假設這樣的結點唯一)。
解:在單鏈表中刪除一個結點先要找到它的前驅結點,用指針p掃描整個單鏈表,pre指向結點p的前驅結點,再掃描時用maxp指向data域值最大的結點,maxpre指向maxp所指結點的前驅結點。當單鏈表掃描完畢後,通過maxpre所指的結點刪除其後的結點,即刪除了結點值最大的結點。算法如下:
void delmaxnode(LinkNode * &L)
{
LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while(p!=NULL)
{
if(maxp->data<p->data)
{
maxp=p;
maxpre=pre;
}
pre=p;
p=p->next;
}
maxpre->next=maxp->next;
free(maxp);