zoukankan      html  css  js  c++  java
  • 链表 | 递归删除不带头结点链表所有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

    测试效果:

  • 相关阅读:
    31、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
    30、[源码]-AOP原理-注册AnnotationAwareAspectJAutoProxyCreavi
    29、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreatovi
    magento 常用的函数
    magento性能优化的教程(非常详细)
    magento性能优化
    magento搜索属性值的设置方法
    Magento 的程序架构与流程
    Magento入门开发教程
    高级Magento模型 EAV
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8372899.html
Copyright © 2011-2022 走看看