链表 | 递归删除不带头结点链表所有x元素
王道P37 T1 :
设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。
王道上的答案绝对是错的,我自己想了一个
函数主体
LinkList* del_x(LinkList* prior,LinkList* L,int x){ if(L==NULL) return NULL; if(L->data==x){ if(prior==NULL){ LinkList* ans=L->next; delete L; if(ans!=NULL) ans=del_x(NULL,ans,x); //通过这个语句,如果链表开头全是x,全部删除 return ans; //头结点含x,返回非x元素 }else{ prior->next=L->next; delete L; del_x(prior,prior->next,x); return prior; } } if(L->data!=x){ del_x(L,L->next,x); return L; //头结点不含x,返回头结点 } }
调用方法:
L=*del_x(NULL,&L,2);
完整代码:
#include <stdlib.h> #include <cstdio> using namespace std; typedef struct LinkList{ int data; struct LinkList * next=NULL; LinkList(){ } LinkList(int x){ data=x; } }LinkList; LinkList build_list(int *arr,int n){ LinkList L(arr[0]); LinkList* p=&L; int i; for(i=1;i<n;i++){ p->next=new LinkList(arr[i]); p=p->next; } return L; } void print_list(LinkList & L){ LinkList* p=&L; while(p){ printf("%d ",p->data); p=p->next; } puts(""); } LinkList* del_x(LinkList* prior,LinkList* L,int x){ if(L==NULL) return NULL; if(L->data==x){ if(prior==NULL){ LinkList* ans=L->next; delete L; if(ans!=NULL) ans=del_x(NULL,ans,x); //通过这个语句,如果链表开头全是x,全部删除 return ans; //头结点含x,返回非x元素 }else{ prior->next=L->next; delete L; del_x(prior,prior->next,x); return prior; } } if(L->data!=x){ del_x(L,L->next,x); return L; //头结点不含x,返回头结点 } } int main(){ int arr[6]={2,2,1,2,3,2}; LinkList L=build_list(arr,6); print_list(L); L=*del_x(NULL,&L,2); print_list(L); }
测试效果: