王道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,);

完整代码:

#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[]);
LinkList* p=&L;
int i;
for(i=;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[]={,,,,,};
LinkList L=build_list(arr,);
print_list(L);
L=*del_x(NULL,&L,);
print_list(L);
}

测试效果:

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

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

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

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

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

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

    1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

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

    本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...

  5. 083 Remove Duplicates from Sorted List 有序链表中删除重复的结点

    给定一个排序链表,删除所有重复的元素使得每个元素只留下一个.案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2- ...

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

    #include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList ...

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

    所实现的循环单链表的结构例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill ...

  8. 剑指offer-两个链表的第一个公共结点-链表-python

    题目描述 输入两个链表,找出它们的第一个公共结点.   class Solution: def FindFirstCommonNode(self, pHead1, pHead2): # write c ...

  9. C++单链表类(带头结点)

    Link.h #ifndef _LINK_0411 #define _LINK_0411 #include <string> #include <iostream> //定义数 ...

随机推荐

  1. MOOC Web前端笔记(三):CSS样式

    CSS样式 CSS概述 CSS--Cascading Style Shees层叠样式表 HTML定义网页的内容,CSS定义内容的样式. 内容和样式相互分离,便于修改样式. CSS语法 p{ font- ...

  2. C# 转成金额每三位逗号隔开

    long aaaa = 14200666; Console.WriteLine(aaaa.ToString("N0")); Console.WriteLine(string.For ...

  3. Mybatis 原理分析

    对于入门程序的流程分析 使用过程 读配置文件 读取配置文件时绝对路径和相对路径(web工程部署后没有src路径)都有一定问题,实际开发中一般有两种方法 使用类加载器,它只能读取类路径的配置文件 使用S ...

  4. PHP-FPM的相关知识的深度解释

    一.需要搞清楚几个名词概念 1.          CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展 ...

  5. java接口中的成员方法和成员变量

    接口的含义理解:接口可以理解成统一的"协议",而接口中的属性也属于协议中的内容;但是接口的属性都是公共的,静态的,最终的 接口的成员特点:A:成员变量 只能是常量.默认修饰符 pu ...

  6. java web的转发与重定向

    java web的转发与重定向 原创 2012年12月15日 11:51:39 19312 转发和重定向的区别 一.使用方法 转发:request.getRequestDispatcher(" ...

  7. 小程序开发 解析内容中unicode转中文编码显示问题

    如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 小程序后台返回数据的时候,html内容是经过unicode编码的不能直接显示,里边全是类似&#xxx ...

  8. Mac 设置redis开机启动

    1.创建一个plist文件 首先我们需要在/Library/LaunchDaemons目录下创建一个plist文件,使用如下命令: 复制代码代码如下: sudo vim /Library/Launch ...

  9. Prometheus学习笔记(5)Grafana可视化展示

    目录 一.Grafana安装和启动 二.配置数据源 三.配置dashboard 四.配置grafana告警 一.Grafana安装和启动 Grafana支持查询Prometheus.从Grafana ...

  10. angular8 配置 测试环境打包指令 生成测试环境包指令

    1.angular.json 文件中在architect 下添加 buildTest指令 距离位置 projects => (你的项目名称) => architect 下和 build 指 ...