线性表--链表-1

主要内容

  1. 链表基础练习题

一.链表练习题

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

代码如下(示例):
f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点,
显然有f(L->next,x)的功能是删除以L->next 为首结点指针的单链表中所有值等于x 的结点。
由此,可以推出递归模型如下。
终止条件:f(L,x)=不做任何事情;    若L为空表
递归主体:f(L,x)=删除*L结点;f(L->next,x); 若L->data==xf(L,x)=f(L->next,x);  其他情况void Del_X_3(Linklist &L,ElemType x){//递归实现在单链表L中删除值为x的结点LNode *p; //p指向待删除结点if(L==NULL) //递归出口return;if(L->data==x){ //若L所指结点的值为Xp=L; //删除*L,并L=L->next;free(p);Del_X_3(L,x); //递归调用}else  //若L所指结点的值不为XDel_X_3(L->next,x);  //递归调用
}

2.设 L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值

代码如下(示例):
void R Print(LinkList L){
//从尾到头输出单链表L中每个结点的值if(L->next!=NULL){ //递归R_Print(L->next);) //ifif(L!=NULL) print(L->data); //输出函数
}
void R_Ignore_Head(LinkList L){
if(L->next!=NULL) R_Print(L->next);
}

3.试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为 O(1).

代码如下(示例):
假设 pre、p和r指向3个相邻的结点,如下图所示。假设经过若干操作后,*pre 之前的结点的指针都已调整完毕,它们的 next 都指向其原前驱结点。现在令*p 结点的 next 域指向pre 结点,注意到一旦调整指针的指向,*p 的后继结点的链就会断开,为此需要用r 来指向原*p 的后继结点。处理时需要注意两点:一是在处理第一个结点时,应将其 next 域置为 NULL,而不是指向头结点(因为它将作为新表的尾结点);二是在处理完最后一个结点后,需要将头结点的指针指向它

在这里插入图片描述

LinkList Reverse(LinkList L){
//依次遍历线性表 L,并将结点指针反转INode *pre,*p=L->next,*r=p->next;p->next=NULL; //处理第一个结点while(r!=NULL){ //r为空,则说明p为最后一个结点pre=p; //依次继续遍历p=r;r=r->next;p->next=pre; //指针反转}L->next=p; //处理最后一个结点return L;
}

4.有一个带头结点的单链表 L,设计一个算法使其元素递增有序。

代码如下(示例):
算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后依次扫描单链表中剩下的结点*p (直至 p==NULL 为止),在有序表中通过比较查找插入*p 的前驱结点*pre,然后将*p 插入到*pre 之后,如下图所示。

在这里插入图片描述

void Sort(LinkList &L)(
//本算法实现将单链表L的结点重排,使其递增有序LNode *p=L->next,*pre;LNode *r=p->next; //r保持*p后继结点指针,以保证不断链微p->next=NULL; //构造只含一个数据结点的有序表p=r;while(p!=NULL)(r=p->next; //保存*p的后继结点指针pre=L;while(pre->next!=NULL&&pre->next->data<p->data)pre=pre->next; //在有序表中查找插入*p的前驱结点*prep->next=pre->next; //将*p插入到*pre之后pre->next=p;p=r; //扫描原单链表中剩下的结点}
}

5.设计一个算法用于判断带头结点的循环双链表是否对称

代码如下(示例):
算法思想:让 p从左向右扫描, 从右向左扫描,直到它们指向同一结点(p==g,当循环双链表中结点个数为奇数时)或相邻(p->next=g或g->prior=p,
当循环双链表中结点个数为偶数时)为止,若它们所指结点值相同,则继续进行下去,否则返回 0。若比较全部相等,则返回1int Symmetry(DLinkList L){
//本算法从两头扫描循环双链表,以判断链表是否对称DNode *p=L->next,*q=L->prior; //两头工作指针while(p!=q&&p->next!=g) //循环跳出条件if(p->data==q->data){ //所指结点值相同则继续比较p=p->next;q=q->prior;}else //否则,返回0return 0;return 1; //比较结束后返回1
}

6.有两个循环单链表,链表头指针分别为 h1和h2,编写一个函数将链表 h2 链接到链表h1 之后,要求链接后的链表仍保持循环链表形式

代码如下(示例):
算法思想:先找到两个链表的尾指针,将第一个链表的尾指针与第二个链表的头结点链接起来,再使之成为循环的。LinkList Link(linklist &hl,LinkList ah2){
//将循环链表h2链接到循环链表h1之后,使之仍保持循环链表的形式LNode *p,*q; //分别指向两个链表的尾结点p=h1;while(p->next!=h1) //寻找h1的尾结点p=p->next;q=h2;while(q->next!=h2) //寻找h2的尾结点q=q->next;p->next=h2; //将h2链接到h1之后q->next=h1; //令h2的尾结点指向 h1return hl;
}

总结

以上是今天要讲的内容,练习了链表相关习题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/195526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git常用命令和参数有哪些?【git看这一篇就够了】

文章目录 前言常用命令有哪些git速查表奉上常用参数后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出…

Linux应用开发基础知识——输入系统应用编程(八)

前言&#xff1a; 触摸屏分为电阻屏、电容屏。电阻屏结构简单&#xff0c;在以前很流行&#xff1b;电容屏支持多点触摸&#xff0c;现在的手机基本都是使用电容屏。我们应当注意的是LCD、触摸屏不是一回事&#xff0c;LCD 是输出设备&#xff0c;触摸屏是输入设备。制作触摸屏…

Linux下快速确定目标服务器支持哪些协议和密码套件

实现原理是利用TLS协议的特点和握手过程来进行测试和解析响应来确定目标服务器支持哪些TLS协议和密码套件。 在TLS握手过程中&#xff0c;客户端和服务器会协商并使用相同的TLS协议版本和密码套件来进行通信。通过发送特定的握手请求并分析响应&#xff0c;可以确定目标服务器…

入股合作协议要不要写章程

公司章程&#xff0c;是注册公司的基本文件&#xff0c;也公司必备的规定公司组织及活动基本规则的书面文件&#xff0c;是公司成立的必不可少的基础&#xff0c;也是公司赖以生存的灵魂。那么&#xff0c;这次要和大家讨论的是有关于入股合作协议要不要写章程的问题了。 入股合…

Spring cloud - Hystrix服务限流、熔断及降级

Hystrix的作用 Hystrix的主要作用是在微服务环境下防止服务雪崩&#xff0c;确保服务弹性及可用性。 具体来说&#xff0c;Hystrix可以实现&#xff1a; 服务降级&#xff1a;通过fallback实现服务不可达情况下的服务降级作用。熔断&#xff1a;服务不可达的情况下在设定时间…

Python---练习:封装一个函数,用于生成指定长度的验证码

练习涉及相关链接&#xff1a;Python---练习&#xff1a;编写一段Python代码&#xff0c;生成一个随机的4位验证码-CSDN博客 Python----函数中的说明文档-CSDN博客Python---return返回值-CSDN博客 代码&#xff1a; # 定义一个generate_code()函数 def generate_code(num): …

〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿&#xff0c;实现功率均分&#xff0c;保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类&#xff1a;协调同…

探索无限可能:APITable免费开源多维表格与可视化数据库远程访问的魅力

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

JAVA多线程(5)

JAVA多线程(5) 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口…

C语言:动态内存管理

目录 为什么存在动态内存分配 动态内存函数 malloc和free 示例 calloc 示例 realloc 示例 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟的空间进行越界访问 对于非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块内存多次释…

有成效的工作

从开始上班起&#xff0c;听到过工作是做不完得。 大概的意思&#xff0c;现在的工作做完了&#xff0c;就会分配新的工作。所以总也做不完。 如果是做不完的&#xff0c;那么是不是在一个岗位上就一直干着呢。既然这个很难成立。那其实工作是可以干得完的。 一个岗位的终结&am…