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

    测试效果:

  • 相关阅读:
    eclipse控制台出现中文乱码的问题
    运行jar包
    [MongoDB]------windos下的安装部署与基础使用
    SQLMap-----初识
    序言(第一次写随笔,怎么才能装成经常写的样子呢)
    php7.4编译(centos)
    NGINX 2
    NGINX 1
    LVS的DR模式与NET模式的负载均衡实验
    命令在线查询
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8372899.html
Copyright © 2011-2022 走看看