链表 | 递归删除不带头结点链表所有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);
}



测试效果:

原文地址:https://www.cnblogs.com/TQCAI/p/8372899.html

时间: 2024-11-09 02:42:40

链表 | 递归删除不带头结点链表所有x元素的相关文章

【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】

[083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客<C语言实现非循环双链表节点的删除(不带头结点)>中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦.自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便.代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList . 核心代码如下: //删除pos位置的节点 int DeletePosList(Node *pHead,Node *pTail,int pos){

JAVA单链表的实现-不带头结点且没有尾指针

本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java

【c++版数据结构】之双链表的实现(带头结点以及尾节点)

所实现的双链表的结构如下图所示: 双链表的实现,和第一篇文章单链表的实现大致相同点击打开链接 本篇文章在构建节点的同时,初始化构建节点的前驱和后继,具体细节参考下列代码 头文件:DList.h #ifndef DLIST_H_ #define DLIST_H_ typedef enum{FALSE,TRUE}Status; #include<iostream> #include<cassert> using namespace std; template<class Type

C语言:【单链表】删除一个无头单链表的非尾节点

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next;  }SListNode; SListNode* BuyNode( DataType x) {     SListNode* next = (SListNode*)mall

不带头结点的单链表递归删除元素为X的结点

关于php时区时间错误问题 date 当前时间 时差 当地 本地date_default_timezone_set 之前有一个遗留问题,就是echo date("y-m-d h:i:s",time())回来的时间总是与实际时间对不上,今天终于在网上找到了原因和解决方法,分享如下: 我补充一点,我按照下面提示的方法修改php.ini找不到date.timezone 这行,是不是就没办法了呢,当然不是啦,哈哈没有的话就自己加嘛,自己动手丰衣足食.我加了这样一句date.timezone =

【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

所实现的循环单链表的结构如下图所示: 循环单链表的实现,和上一篇文章单链表的实现大致相同点击打开链接,略有区别: 1:循环判断的条件不再是s == NULL或者s->next == NULL,而是他们是否等于头指针.2: 断开链表时的处理,尾节点的next不是NULL,而是指向头结点 具体细节参考上一篇文章 头文件:SCList.h #ifndef SCLIST_H #define SCLIST_H #include<iostream> #include<cassert> u