数据结构---C语言版 408 2019-41题代码版

题目:

2019 ( 单链表 )
41 .( 13 分)设线性表 L ( a 1 , a 2 , a 3 ,…… ,an2, a n 1 , a n ) 采用带头结点的单链表保存,链表中
的结点定义如下:
typedef struct node {
int data;
struct node* next;
} NODE
请设计一个空间复杂度为 O (1) 且时间上尽可能高效的算法,重新排列 L 中的各结点,
得到线性表 L   ( a 1 , a n , a 2 , a n 1 , a 3 , a n 2 ,…… )

 

思想:

读题发现本题主要实现前半部分顺序不变,后半部分变为逆序,且最后返回前后前后交叉的链表。

不妨 将前半部分和后半部分分开,单独处理后半部分,最后将后半部分插入里面。

所以:

1.将前半部分和后半部分分开-->即找到中间结点将链表一刀两断。

找中间结点---》不难想到双指针last、fast

这里一定要注意将last定义last=L->next;fast=L->next;!第一次写的时候忘定值了last,fast=L->next;这样last并未赋值后面last移动不了

双指针就是fast一下子移动两步,last一步一步走,当fast到终点的时候,last也就到中点了。(

但因为个树奇偶情况不同,所以fast需要移动一个判断一下,而只有移动两次的时候,last才移动,能保证一定在中间)

LinkList last,fast;
last=L->next;fast=L->next;	
while(fast){fast=fast->next;if(!fast) break;fast=fast->next;if(!fast) break;last=last->next;}

 这里一刀两断,方法太棒了,直接让last->next=NULL;斩断。

L2->next=last->next;
last->next=NULL;
2.单独处理后半部分

因为题目要求 空间复杂度为 O(1),所以考虑原地逆置。

原地逆置:其实就是把--->改为<---;然后原先第一个结点(L->next)的下一个设置为NULL,头结点后接最后一个节点

LinkList reverse(LinkList&L2) {if(!L2||!L2->next)	return L2;LinkList pre=L2->next;LinkList p=pre->next;LinkList last;while(p){last=p->next;p->next=pre;pre=p;if(!last) break;p=last;}L2->next->next=NULL;//链表的第一个结点的next要为NULL; L2->next=p;return L2;
}
 3.第三步就是合并了,按照前后前后合并就可以。合并的时候,记得设置结点保存后面的一个结点
//链表合并 
void merge(LinkList &L,LinkList L2) {LinkList p1,p2;p1=L->next;p2=L2->next;while(p1&&p2){LinkList last1=p1->next;LinkList last2=p2->next;p1->next=p2;p2->next=last1;p1=last1;p2=last2;}if(p1) p1->next=NULL;if(p2) p2->next=NULL;
}

 代码汇总:

typedef struct node{int data;struct node* next;
}LNode,*LinkList; //尾插法新建链表
LinkList creat_tail(LinkList &L){int x;scanf("%d",&x);L=(LNode*)malloc(sizeof(LNode));//创建头结点 LNode* tail;tail=L;while(x!=9999){LinkList s=(LNode*)malloc(sizeof(LNode));s->data=x;tail->next=s;s->next=NULL;tail=s;scanf("%d",&x);}return L;
} //找到中间节点--》双指针的运用,拆分巧妙 
void find_mid(LinkList L,LinkList&L2){L2=(LNode*)malloc(sizeof(LNode));LinkList last,fast;last=L->next;fast=L->next;while(fast){fast=fast->next;if(!fast) break;fast=fast->next;if(!fast) break;last=last->next;}L2->next=last->next;last->next=NULL;}
//原地逆置
LinkList reverse(LinkList&L2) {if(!L2||!L2->next)	return L2;LinkList pre=L2->next;LinkList p=pre->next;LinkList last;while(p){last=p->next;p->next=pre;pre=p;if(!last) break;p=last;}L2->next->next=NULL;//链表的第一个结点的next要为NULL; L2->next=p;return L2;
}
//链表合并 
void merge(LinkList &L,LinkList L2) {LinkList p1,p2;p1=L->next;p2=L2->next;while(p1&&p2){LinkList last1=p1->next;LinkList last2=p2->next;p1->next=p2;p2->next=last1;p1=last1;p2=last2;}if(p1) p1->next=NULL;if(p2) p2->next=NULL;
}
//指针打印
void Print(LinkList L) {LNode* P=L->next;while(P){printf("%3d",P->data);P=P->next;}
}
int main(){LinkList L;creat_tail(L);Print(L);LinkList L2=NULL;printf("_____________\n");find_mid(L,L2);printf("_________________\n");Print(L);Print(L2);printf("__________________\n");L2=reverse(L2);Print(L2);printf("____________\n");merge(L,L2);free(L2);Print(L);printf("________________\n");
}

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

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

相关文章

Smart PLC模拟量采集和低通滤波器组合应用

SMART PLC模拟量采集功能块"S_ITR"算法公式和详细代码请参考下面文章&#xff1a; 1、模拟量采集功能块"S_ITR" https://rxxw-control.blog.csdn.net/article/details/121347697https://rxxw-control.blog.csdn.net/article/details/1213476972、线性转换…

ARM-v7 程序计数器PC的相关指令与应用

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

vscode 配置 c 语言 问题解决

1.VS code调试时显示Unable to start debugging.The value of miDebuggerPath is invalid。 解决方法: VS code调试时显示Unable to start debugging.The value of miDebuggerPath is invalid_unable to start debugging. the value of midebugger-CSDN博客 2.VSCode运行C终端…

提示词工程技术:类比、后退、动态少样本、自动生成CoT

类比提示 “类比提示”利用类比推理的概念&#xff0c;鼓励模型生成自己的例子和知识&#xff0c;从而实现更灵活和高效的解决问题。 后退提示 “后退提示”专注于抽象&#xff0c;引导模型推导出高级概念和原理&#xff0c;进而提高其推理能力。 使用一个基本的数学问题来…

isdigit 是 Python 中字符串对象的一个方法,用于检查字符串中的所有字符是否都是数字。

如果字符串中的所有字符都是数字&#xff0c;则返回 True&#xff0c;否则返回 False。这个方法只能用于检查整数&#xff0c;并且它只能识别 0-9 的数字字符。 这里有一个使用 isdigit 方法的例子&#xff1a; s "12345" if s.isdigit(): print("字符串只包…

npm下载时下载失败解决方法

1.清楚缓存 npm cache clean --force2.切换下载镜像 1.查看当前使用的镜像地址命令 npm config get registry切换为淘宝镜像命令&#xff08;安装一些package容易报错&#xff09; npm config set registry https://registry.npm.taobao.org或官方&#xff1a; npm config…

分类算法(Classification algorithms)

逻辑回归(logical regression&#xff09;&#xff1a; 逻辑回归这个名字听上去好像应该是回归算法的&#xff0c;但其实这个名字只是在历史上取名有点区别&#xff0c;但实际上它是一个完全属于是分类算法的。 我们为什么要学习它呢&#xff1f;在用我们的线性回归时会遇到一…

读书·基于RISC-V和FPGA的嵌入式系统设计·第3章

72.8051单片机的弊端和指令集架构CISC的缺点 76.RV指令集的特征&#xff08;⭐&#xff09; 特权架构和特权指令集是相关但不完全相同的概念。 特权架构&#xff08;Privileged Architecture&#xff09;指的是计算机体系结构中用于实现特权级操作的硬件和软件机制。特权架构定…

RabbitMQ——死信队列

RabbitMQ——死信队列 死信队列&#xff08;Dead Letter Queue&#xff0c;DLQ&#xff09;是 RabbitMQ 中的一种重要特性&#xff0c;用于处理无法被消费的消息&#xff0c;防止消息丢失。 死信的来源 在消息队列中&#xff0c;当消息满足一定条件而无法被正常消费时&#xf…

电商运营常用名词解释

电商运营中的基础名词解释 GMV∶成交总额&#xff0c;含拍下未支付订单金额 ROl:投入产出比&#xff0c;ROl交易额/花费&#xff0c;投入产出比越高越好 uV︰独立访客&#xff0c;统计1天内访问某站点的用户数 PV:访问量&#xff0c;即页面浏览量或点击量。一个顾客浏览了两次…

前端框架的发展历史介绍

前端框架的发展历史是Web技术进步的一个重要方面。从最初的简单HTML页面到现在的复杂单页应用程序&#xff08;SPA&#xff09;&#xff0c;前端框架和库的发展极大地推动了Web应用程序的构建方式。以下是一些关键的前端框架和库&#xff0c;以及它们的发布年份、创建者和主要特…

java-ssm-jsp的问卷调查系统的设计与实现

java-ssm-jsp的问卷调查系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

抖音商家活动信息未在商详展示会有哪些处罚?

一、什么是「违规玩法-活动信息未在商详展示」? 什么是「违规玩法-活动信息未在商详展示」?由于当前平台未提供官方营销工具(例如免单、返现等)&#xff0c;但是创作者在进行商品推广(不仅限口播、画面、标题文案等)宣传该类营销玩法&#xff0c;未在商品商详页展示说明&…

第十五章垃圾回收相关算法

第十五章垃圾回收相关算法 文章目录 第十五章垃圾回收相关算法1. 垃圾标记阶段的算法之引用计数算法1.1 垃圾标记阶段&#xff1a;对象存货判断1.2 方式一&#xff1a;引用计数算法循环引用 1.3 小结 2. 垃圾标记阶段的算法之可达性分析算法2.1 方式二&#xff1a;可达性分析&a…

Qt 定时器事件

文章目录 1 定时器事件1.1 界面布局1.2 关联信号槽1.3 重写timerEvent1.4 实现槽函数 启动定时器 2 定时器类 项目完整的源代码 QT中使用定时器&#xff0c;有两种方式&#xff1a; 定时器类&#xff1a;QTimer定时器事件&#xff1a;QEvent::Timer&#xff0c;对应的子类是QTi…

sys内建模块

一、概述 sys 模块是 Python 标准库中的一个内置模块&#xff0c;提供了与 Python 解释器及其运行时环境交互的函数和变量。它允许你访问和操作与解释器状态相关的信息 1、需要导包 不会自动导入&#xff0c;需要显示的将sys模块导入 import sys 二、常用方法 1、sys.exit(…

Linux命令-cp命令(将源文件或目录复制到目标文件或目录中)

说明 cp命令 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&am…

HttpURLConnection详解及使用

HttpURLConnection 请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowUserInteractionsetDefaultUseCaches 发送URL请求 建立实际连接之后&#xff0c;就是发送请求&#xff0c;把请求参数传到…

docker-swarm集群搭建

目录 一、docker swarm介绍 二、部署docker 三、搭建集群 3.1 工作模式 3.2 将当前主机作为leader 3.3 将第二个节点slave1加入到worker 3.4 将第三个节点slave2也加入到worker 3.5 将第四个节点(slave3)加入到manager 四、总结 一、docker swarm介绍 Docker Swarm…

python图像处理,opencv笔记汇总

基本图像处理 翻转 使用python翻转图片 按比例缩放&#xff0c;拼接 【opencv】指定宽或高按比例缩放图片 & 拼接图片 待更新