设计递归算法,删除不带头结点的单链表L中所有值为X的结点

王道上的一道题

1、设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

答案如下

void Del_X_3(LinkList &L,ElemType x){
     LNode *p;
     if(L==NULL) return ;
     if(L->data==x){
         p=L;
         L=L->next;
         free(p);
         Del_x_3(L,x);
     }
     else Del_x_3(L->next,x);
 } 

很多同学觉得 free(p); 这条语句,该语句会造成断链

其实不会,为什么

很多同学认为这三步是这样的,如图

设计递归算法,删除不带头结点的单链表L中所有值为X的结点_第1张图片

 

所以把p释放后,2和6没有连接,所以认为链断了

其实是因为没有理解清楚此处的递归

倘若第一个结点就是要删除的x的话,那么不用递归,直接删除

那么这三行代码没有问题,直接让L往后指,把p释放

但是倘若不是第一个,也就是进入else了,进入递归

注意:递归里面的L并不是当前结点,而是引用的上一层的L->next

所以L=L->next;这句代码,实际上是L->next=L->next->next;

如图

设计递归算法,删除不带头结点的单链表L中所有值为X的结点_第2张图片

ps:

悄咪咪建了个群

21的小伙伴欢迎交流~

重度拖延症患者

设计递归算法,删除不带头结点的单链表L中所有值为X的结点_第3张图片

 

 

 

 

你可能感兴趣的:(数据结构(严蔚敏版))