链表 | 递归删除不带头结点链表所有x元素

Posted TQCAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表 | 递归删除不带头结点链表所有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);
}
View Code

 


 

测试效果:

 

以上是关于链表 | 递归删除不带头结点链表所有x元素的主要内容,如果未能解决你的问题,请参考以下文章

数据结构不带头结点非循环的单链表

软考题目之头结点头指针和首元节点

链表的定义

数据结构编程实验

删除链表中的重复节点

java实现单向循环链表