时间是伟大的作者,她能写出未来的结局。 ——卓别林
目录
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:

输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。和循环其实和像,都有结束的条件。
这里就要用到我们之前学习的双指针的方法。假如要反转的数字是 1 2 3。

但是这样写又存在很大的问题,在第二次反转指针的时候,n2和n2的下一个结点失去了连续,下次就找不到n2的下一个结点了,所以我们还要设置一个变量来保存n2的下一个结点。
改进:

有了上面的思路,我们就可以写代码了。
struct ListNode* reverseList(struct ListNode* head)
{
if(head==NULL)
return NULL;
struct ListNode*n1=NULL,*n2=head,*n3=head->next;
while(n2)
{
n2->next=n1;//这里就是反转指针
n1=n2;
n2=n3;
if(n3)//当n3为空的时候,就不能使用n3->next,所以这里一定要判断
n3=n3->next;
}
return n1;//结束n1为头指针,返回头指针
}
时间复杂度O(N)。空间复杂度O(1)。
头插法也就是我们学习单链表那样,在链表的头结点上面插入数据。这里我们就要先设置一个NULL的头结点,再把原链表的结点一个一个取下来,再链接到NULL的头上面,再把头结点改为新链接上去的结点。
这题同样会使用到双指针。可见双指针问题还是非常实用的,一定要学会。
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode*cur=head;
struct ListNode*next=NULL;
struct ListNode*newhead=NULL;
while(cur)
{
next=cur->next;
cur->next=newhead;//头插
newhead=cur;//头结点被重新赋值
cur=next;
}
return newhead;
}
时间复杂度O(N)。空间复杂度O(1)。
递归简单来说就是在运行过程中不断调用自己,直到碰到终止条件,返回结果的过程。
对于递归法可能不太好理解,我自己也看了很久,不知道讲的对不对。如果讲错了,还望各位老铁能够指证。对于递归法,我们先把代码放处理啊,再通过一步一步的画图,好好地理解递归的奥妙。
struct ListNode* reverseList(struct ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
struct ListNode*newhead=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return newhead;
}
对于这个代码还是比较好理解的,当链表为空时,直接返回head,也就是NULL。当链表的下一个结点为空的时候,也就是链表只有一个结点,所以我们也是返回head。
if(head==NULL||head->next==NULL)
return head;
假设要反转的数字是 1 2 3 4 5。
第一次递归:即执行下面的语句。
虽然说递归的代码简洁,但是不怎么好理解,空间复杂度也为O(N)。 所以还是建议使用双指针的做法,这个方法一定要知道。
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
我有:o=File.new("ouput.txt","rw+")File.new("my_file.txt").lines.reverse_each{|line|?????line}o.close不知道用什么方法写入文件输出o 最佳答案 puts理解数组,因此您可以将其简化为:File.open("f2.txt","w"){|o|o.putsFile.readlines("f1.txt").reverse} 关于ruby-简单的问题:Readfile,在Ruby中反转它并写入另一个文件,
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
我有一个格式的散列:{key1=>[a,b,c],key2=>[d,e,f]}我想结束:{a=>key1,b=>key1,c=>key1,d=>key2...}实现此目标的最简单方法是什么?我正在使用RubyonRails。更新好的,我设法从服务器日志中提取了真实的对象,它是通过AJAX推送的。Parameters:{"status"=>{"1"=>["1","14"],"2"=>["7","12","8","13"]}} 最佳答案 hash={:key1=>["a","b","c"],:key2=>["d","e","f"]}第一
前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息)【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客目录前言一、带头双向循环链表是什么?二、实现带头双向循环链表1.结构体和要实现函数2.初始化和打印链表3.头插和尾插4.头删和尾删5.查找和返回结点个数6.在pos位置之前插入结点7.删除指定pos结点8.摧毁链表三、完整代码1.DSLinkList.h2.DSLinkList.c3.test.c总结前言带头双向循环链表,是链表中最为复杂的一种结
为了便于创作,我这样写我的散列:h={:key1:[:val1,:val2,:val3],:key2:[:val4,:val5,:val6]}但无论我在哪里使用它,我都需要查找与值关联的键。目前我正在做以下事情来改造它:h=Hash[*{:key1:[:val1,:val2,:val3],:key2:[:val4,:val5,:val6]}.map{|key,vals|vals.map{|val|[val,key]}}.flatten]这给了我想要的:{:val1=>:key1,:val2=>key1,:val3=>key1,:val4=>key2,:val5=>:key2,:val6
您将模块包含在类中,以在向该特定类添加类方法和实例方法方面扩展类功能。moduleMdefself.class_method_from_module'fromclass_method_from_module'enddefinstance_method_from_module'frominstance_method_from_module'endendclassCincludeMdefself.class_method'fromclass_method'enddefinstance_method'frominstance_method'endendputsC.class_method=>
我试图在不使用reverse方法的情况下反转Enumerable(如Array),而是使用reverse_each迭代器。我希望,下面的代码就足够了:p[1,2,3].reverse_each{|v|v}然而,该block不会以相反的顺序返回数组。我当然可以写[1,2,3].reverse_each{|v|pv}但我想以第一种方式收集元素。这种行为的根源是什么?我应该如何编写表达式来满足要求? 最佳答案 从1.8.7开始,Enumerable#each_*方法returnanenumerator当没有提供block时,那些原本命令式