链表 | 递归删除不带头结点链表所有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,);
完整代码:
#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)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
/*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- JAVA单链表的实现-不带头结点但带有尾指针
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...
- JAVA单链表的实现-不带头结点且没有尾指针
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...
- 083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
给定一个排序链表,删除所有重复的元素使得每个元素只留下一个.案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2- ...
- 不带头结点的单链表递归删除元素为X的结点
#include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList ...
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
所实现的循环单链表的结构例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill ...
- 剑指offer-两个链表的第一个公共结点-链表-python
题目描述 输入两个链表,找出它们的第一个公共结点. class Solution: def FindFirstCommonNode(self, pHead1, pHead2): # write c ...
- C++单链表类(带头结点)
Link.h #ifndef _LINK_0411 #define _LINK_0411 #include <string> #include <iostream> //定义数 ...
随机推荐
- golang学习笔记--函数和方法
在go中,函数类型是一等类型,这意味着可以吧函数当做一个值来传递和使用. func divide(dividend int,divisor int)(int,error){ //省略部分代码 } 参数 ...
- jwt的简单使用
目录 简介 java版本 golang版本 简介 使用jwt对数据进行存储加密,分为java和golang版本. java版本 maven配置 <dependency> <group ...
- Linux学习笔记之rsync配置
0x00 rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. ...
- C#读写设置修改调整UVC摄像头画面-白平衡
有时,我们需要在C#代码中对摄像头的白平衡进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄 ...
- GitLab CI/CD的官译【原】
CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...
- Socket心跳机制-JS+PHP实现
本文是我在实际工作中用到的Socket通信,关于心跳机制的维护方式,特意总结了一下,希望对朋友们有所帮助. Socket应用:首先Socket 封装了tcp协议的,通过长连接的方式来与服务器通信,是由 ...
- 简要介绍Linux网络服务的种类
如果有人问你Linux最强大的功能是什么,你大概会回答“是网络功能”.Lmux操作系统的优势之一就是网络功能了,这包含比较稳定的系统资源分配,以及较为安全的网络防护能力,所以许多人都喜欢用它来进行网络 ...
- Android-----File(文件各种操作)
在Android编程中,操作文件是基本的必备技能,现在做一个操作文件的小工具:DocumentTool.java 代码如下: package com.hs.example.exampleapplica ...
- vue element-ui tree 根节点固定子节点懒加载 首次加载根节点并展开
关键代码: <el-tree ref="foldTree" node-key="id" :highlight-current="true&quo ...
- 【前端_js】array.forEach和$.each()及$().each()的用法与区别
1.$.each():方法是jQuery中的方法,用于遍历数组或对象.用法:$.each(array,function(index,value){...}),有两个参数,第一个为待遍历的数组或对象,第 ...