題目:設計一個遞歸算法,刪除不帶頭結點的單鏈表L中所有值爲x的結點。
關鍵字:遞歸算法+不帶頭結點的單鏈表+按值刪除+遞歸工作棧
思路
關注:遞歸算法的設計重點在於找到“遞歸”的部分,即重複調用函數,改變部分相關變量
設f(L,x)的功能是:刪除以L爲首結點指針的單鏈表中所有值等於x的結點,遞歸部分:顯然有f(L->next,x)的功能是刪除以L->next 爲首結點指針的單鏈表中所有值等於x的結點。由此,可以推出遞歸模型如下:
終止條件:f(L,x)=不動;若L此時爲空表
遞歸主體:a.若L->data==x
f(L,x)=刪除*L結點;
f(L->next,x);
b.其他情況
f(L,x)= f(L->next,x);
void Del_x_3(Linklist &L,ElemType x){//遞歸實現在單鏈表L中刪除值爲x的結點
LNode*p;//p指向待刪除結點
if(L==NULL)
return;
if(L->data=x){//若L所指結點的值爲x
p=L;
L=L->next;
free(p); //刪除此節點
Del_x_3(L,x);//遞歸調用
}
else //若L所指結點的值不爲x
Del_x_3(L->next,x);//遞歸調用,對下個元素進行刪除判斷
}