首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一道打印链表的题我写了几种方法

说完了什么是链表之后,阿粉就来说说这个面试题吧。 面试题:从尾到头打印链表 输入链表的第一个节点,从尾到头反过来打印出每个节点的值! 那么这个题目都有哪些的实现思路呢?...当面试官给出这个题目的时候,很多人的第一印象,什么鬼,你想让我怎么实现? 给我一个链表,然后让我倒着来打印,这是不是还得有排序呢?...这方法实际上是最简单的方法,但是被面试官笑着阻止了,他也知道我想偷懒。...尾插法:将每次插入的新结点放在链表的尾部。 也就是说,可以使用头插法来实现,这样的话,读的顺序正好和逻辑顺序相反,就又出现了一种实现链表倒序打印的方法了呀。既然说,那就得好好实现一下。...面试官看到阿粉反应这么快,也就没再多说其他的了,至于收没收到 offer,只是说还有两天以后再进行第二面了,阿粉得好好准备一下面试了,不然下次还不知道会问到什么样子的问题呢。

34220

数据结构-散列表(下)

为什么散列表和链表经常会一起使用? 今天,我们就来看看,在这几个问题中,散列表和链表都是如何组合起来使用的,以及为什么散列表和链表会经常放到一块使用。...LinkedHashMap 也是通过散列表和链表组合在一起实现的。实际上,它不仅支持按照插入顺序遍历数据,还支持按照访问顺序来遍历数据。...我来具体分析一下,为什么这段代码会按照这样顺序来打印。 每次调用 put() 函数,往 LinkedHashMap 中添加数据的时候,都会将数据添加到链表的尾部。...我也就不再啰嗦了。 解答开篇 & 内容小结 弄懂刚刚我讲的这三个例子,开篇的问题也就不言而喻了。我这里总结一下,为什么散列表和链表经常一块使用?...为了解决这个问题,我们将散列表和链表(或者跳表)结合在一起使用。、 课后思考 今天讲的几个散列表和链表结合使用的例子里,我们用的都是双向链表。如果把双向链表改成单链表,还能否正常工作呢?为什么呢?

54920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    留心那些潜在的系统设计问题

    举例来说,有一个日益复杂的类,每个人都修改一点点,一直到最后都没有人愿意去做重构,大家的心态都是一样的:“我只修改了一点点,为什么要我去动那么大的刀,于我没有任何好处”。...,“事情不会那么坏吧”,“不会那么不凑巧吧”,在系统设计阶段尽把事情往好的方向想可未必是件好事;也许更多时候会觉得这是直觉,总觉得某一处设计别扭,不合理却有说不出强硬的理由来,最多只能抱怨一句 “通常它不应该是这样设计的...我想很多人都可以看得出潜在的问题: 清空链表数据是使用时间条件触发的任务来完成,换言之,无论这十分钟内如果事件暴增,也无法触发链表清空的行为,链表很容易变得非常大; 清空链表的任务如果执行过程中出了异常...比如 JVM 的 GC 日志的打印,这样的文件可以协助定位问题,但是如果不设置文件上限大小参数,就有导致磁盘空间不足的风险;还有日志文件,绝大多数系统都有日志文件压缩或者日志文件转移的脚本,但是和前面提到的例子...我不知道这样的系统设计经验怎样才能快速积累,但是我想还是有一些常规模式可循,我不知道是否有比较经典的资料可以学习。

    35010

    数据结构——单链表的实现

    呀哈喽,我是结衣。 链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 这里我来解释一下什么叫做逻辑上连续而物理上补连续。...在进行函数声明之前我还要在详细的解释一下这个结构体和链表的关系,我们来画个图来看看。 我先假设1,2,3的地址就是这些,这么看来他们在内存中肯定不是连续的,要这么把他们关联起来呢?...我还用了一个头节点来指向第一个节点,从图上来看是不是每个节点都联系了起来,这就是有了逻辑上的连续。 下面我来讲解实现链表都要哪些函数。...写好文件我在把上面的结构体写进SList.h的文件里面。 做完这些就开始写函数。首先我们先写一个打印函数。...,为什么链表要用二级指针呢,明明顺序表就只有一级指针。

    12710

    【初阶数据结构】双向链表 - 路途的美好风光(内含双链表的定义和代码实现)

    前言 我已经在初阶数据结构这个栏目中已经给大家讲过了两种数据结构,分别是顺序表和单链表。那么在本文中,我继续的给大家讲解下一个数据结构——双向链表。...你可能会有一个疑惑,单链表我懂,但是这双向链表是啥?没事,接下来我就详细的帮助大家攻略难关。 1....这个节点比较的特殊,它不存储有效的数值。我亲切的称呼它为“哨兵位”。那它有什么作用呢?在单链表的代码实现中,我们会常常苦于链表尾空链表的情况,为此还要专门给出一个判断条件。...(接口) //初始化双向链表 void LTInit(LTNode** pphead); //打印双向链表 void LTPrint(LTNode* phead); //尾插 //这里为什么会使用一级指针...如果我传了个二级指针,你的意思不就是想改我的哨兵位。 //所以,最好传一级指针。

    7910

    算法--天下武功,唯快不破

    我只写JS,为什么也要学习算法? 我入行最开始时是做网页设计的,那是在2003年, 然后一路到了现在,... 所以做为读者的你应该已经明白,我是一个野路子出身的程序员。...其实我内心一直很羞于称自己为程序员, 一般我会说自己是,做网页的、写JS的,或是做前端的。。 因为我根本没有接受过正规的计算机科学教育。...例如昨天我看过的链表,它对数据和查找、插入、删除的处理,就比数组要快很多。 这在简单的应用上看不出来效果,但如果一个股票类网页要加载10000+行列表的时候,就看出差别了。...但如果我不知道这些,我依然只能使用Array数组。 不是说它不好,它只是效率低。 但这不是数组的错,是我的问题。...计算机科学是一门相对成熟的学科,我们遇到的许多问题,应该都早已有了相应的解决方案,只是我没学过所以我不知道。 我想明白这一点的时候,真是悲从中来。

    66650

    反正我是没想到还能有续集。

    我发现一两句话也说不太清楚,于是把 Debug 的关键截图放到文档里面配以文字说明,才勉强能说的比较清楚一点,也不知道这位同学看明白了没。 但就拿这个文档来说:真的是暖男石锤了。 ?...所以在我们自定义的 CLQ 里面加一个打印链表结构的方法: ? 然后给我们的 remove 方法增加一个循环次数的入参,并在操作队列之前和之后调用我们打印链表结构的方法,就像下面这样式儿的: ?...你可以这么理解:我就是把 JDK8 的 CLQ 的 remove 方法的名称变成了 removeJDK8 。 为什么这样命名呢?...490 行是在对象被移除之前,我们可以在这里加一行输出语句打印当前的链表结构。 505 行是在对象被移除之后,我们可以在这里加一行输出语句打印删除操作完成之后的链表结构。...之前,我认为是玄学。而现在,没有什么是玄学,我们要相信科学。 我身边也有朋友碰到过这个问题,如果不知道这个坑,非常的抠脑壳,很容易就“怀疑人生”了: ? ? ?

    71410

    C语言链表实现

    我尝试用最简单的语言与代码来描述链表,事实上它本身也很简单 静态单链表实现 下面一部分的讨论都将围绕上面这幅图片展开,既然是逐步实现,我不考虑在开头就让这个单链表完美实现,它将只有两个部分:链表的创建...用来指向这个链表的第一个节点 node *f=new node;//对应上图第一个节点first node,这种奇葩命名法不是我要让你们学会的,另我使用了new而不是malloc主要是因为惰性...//打印这个链表里面储存的元素 std::cout链表数据:"<<"\n"; node *print_ptr=head;//为什么这里要new一个print_ptr?...next指向需要删除的节点的next,你可能会思考为什么不直接让第一个节点next指向第二个呢?...这个疑问你可以自己解答比较好 动态单链表实现 到这里一个简单的链表就已经实现了,但是我们还需要继续改进,因为我们有时候不知道每个节点储存的数据,所以我们就需要一个动态链表了,下面这个将实现把用户输入的数据以链式结构储存

    5.4K30

    C语言图书信息管理系统

    99.9%的各种信息管理系统(增删改查)问题,那%0.1就是给自己留的后路,毕竟没有什么问题可以100%解决 以后再跟我提xxx管理系统我就给你扔过去这对代码,自己去实现 核心部分:双链表的实现 ?...deroy_node_pt head; deroy_node_pt tail; }deroy_list_t; typedef deroy_list_t* deroy_list_pt; 为什么链表里面的...data是void*呢,谭浩强的C语言不是这样教的啊 void类型是空类型,可以转成任意一种类型,你不知道你插入的数据的结构体是什么,或者说你要插入多种数据的结构体,确定的结构体已经不能够满足需求了,需要定义...数据的指针*/ void* deroy_list_find(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*)) 为什么我要先把功能函数的原型给列举出来...双链表的实现,我之前发过一篇循环双链表,有图解,还算详细 循环双链表 这个双链表还算可以,没有内存泄漏(如果有请告诉我,反正我也不会去改),各种判断安全系数高,功能完善,能处理各种增删改查功能的系统设计

    1.2K20

    学点算法之队列的学习及应用

    约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个。 队列是什么 这道题有多种解法,这里先不说别的,要引出今天的主角——队列。...它不需要参数,并返回一个空队列。 enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。 dequeue() 从队首移除项。它不需要参数并返回 item。...它不需要参数,并返回布尔值。 size() 返回队列中的项数。它不需要参数,并返回一个整数。 ?...print(hotPotato(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], 7)) # output: f 其他解法 比较简单的做法是用循环单链表模拟整个过程...(平均等待时间不包括打印本身的时间,仅指在队列中排队的时间。) 我们假定: 学生们每次打印的页数在1到20页之间。 打印机平均每小时会收到20个打印请求,即平均每180秒1个请求。

    81670

    【C++】STL---list

    首先跟以往不一样的是,list 是一个个节点连接起来的,所以它不是连续的物理空间,这也就意味着,它不用扩容,每次插入的时候只需要申请一个节点,然后连接起来即可; 其次,list 底层的迭代器实现也跟 string...}; } 2. list 正向迭代器类 首先我们先定义一个类模板,其参数有三个,分别是类型、类型的引用(const 和 非const) 、类型的指针(const 和 非const) ; 为什么要定义三个模板参数呢...打印容器的接口 (1)打印链表整型的接口 像 vector、list 这些容器都没有重载流插入运算符,所以我们可以自己实现一个打印的接口函数;我们先来实现一下打印链表整型的接口: // 打印链表 -...(2)打印 list 的接口 我们学了模板,就可以利用模板实现泛型编程,将类型改为模板的泛型,即可打印 list 中的不同类型,如下: // 打印链表 -- 只能打印 list 容器 template...但是上面的接口还是不够完美,要是我想打印 vector 呢?

    9410

    从根上理解 React Hooks 的闭包陷阱

    我们跑一下: 打印的并不是我们预期的 0、1、2、3,而是 0、0、0、0,这是为什么呢? 这就是所谓的闭包陷阱。...首先,我们回顾下 hooks 的原理:hooks 就是在 fiber 节点上存放了 memorizedState 链表,每个 hook 都从对应的链表元素上存取自己的值。...hook 链表有创建和更新两个阶段,也就是 mount 和 update,第一次走 mount 创建链表,后面都走 update。...我们知道了为什么只执行一次,那只执行一次有什么问题呢?定时器确实只需要设置一次呀?...再试一下: 现在就是符合我们预期的了,打印 0、1、2、3、4。 很多同学学了 useEffect 却不知道要返回一个清理函数,现在知道为啥了吧。

    2.7K43

    四大集合20连问,抗住!

    如果是需要保证线程安全的场景,我一般是在集合的外部方法加上锁机制,或者使用线程安全的List集合,我更多使用的是CopyOnWriteArrayList而不是Vector。...它不保证集合的迭代顺序;特别是,它不保证顺序随时间保持不变。此类允许null元素。 我们创建一个HashSet对象,实际上底层创建了一个HashMap对象。...其实PriorityQueue底层数据结构是一个平衡二叉堆:transient Object[] queue,如果你直接打印,打印的是堆里面的存储元素。...HashTable也是线程安全的Map,不过它不仅对修改操作添加加锁操作,获取操作也进行了加锁。...创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

    18098

    【RTOS训练营】GPIO知识和预习安排 + 晚课提问

    问: 晚课示例链表中的phead,为什么是NULL? 答: pHead是一个链表头,如果他不是空的话,他肯定等于某一个结构体的地址。这个结构体在内存里,它的地址一般来说都不会等于0。...答: 简单的说他就是一个判断语句: void assert_param(expr) { if (expr) assert_failed(); } 大概就这意思,他会打印某些语句。...我来写一个malloc函数,最简单的: 我给大家简单讲解一下这个函数: 这就是最简单的malloc函数,但是它只能够实现分配,不能够实现释放。 为什么不能够实现释放呢?...在我们这个例子里面,我怎么知道你要释放了,这块内存多大呀?根本就没有办法知道。 所以我们使用这种方法实现的分配函数,它不支持释放,对于真正的分配函数,我们应该怎么做?...所以对于堆,如果越界访问的话,就有可能会破坏掉头部信息,整个系统什么时候崩溃都不知道。 我们现在大概知道堆的原理之后,我们就来看看堆有什么作用。

    81340

    想进大厂,这是你绕不过的门槛

    为什么是数据结构与算法? 第一,数据结构与算法是科班程序员的必修课程,包括培训机构也有相关课程。...但就如标题所说,想进大厂,数据结构与算法就是你绕不过的门槛,肯定会有人反驳我,说“我不进大厂也可以好好的”,但咱们反问一下,为什么大厂面试必问数据结构与算法?...大厂招聘以及培养的都是高尖人才,他们当然不允许自己的同事在交流技术的时候连“链表”、“堆”、“时间复杂度”是什么都不知道。...两个二叉树是否互为镜像 翻转二叉树or镜像二叉树 求两个二叉树的最低公共祖先节点 二叉树的前序遍历 二叉树的中序遍历 二叉树的后序遍历 前序遍历和后序遍历构造二叉树 在二叉树中插入节点 输入一个二叉树和一个整数,打印出二叉树中节点值的和等于输入整数所有的路径...(static area) 的用法 heap和stack有什么区别 最小的k个数 滑动窗口最大值 丑数 前K个高频元素 有效的括号 最小栈 柱状图中最大的矩形 1.7 高级算法 LRU算法的实现原理 为什么要设计后缀表达式

    68650

    用最容易的方式学会单链表(Python实现)

    本来是要介绍单链表的,为什么讲到Python中的引用呢?因为我们要介绍的单链表这一数据结构就要利用到对象的引用 这一概念。变量本身就存储的一个地址,交换他们的值就是把自己的指向更改。...其实,上面的术语用生活中的大白话来解释,就是我们现在有三个人——我、你、他。当我用手指指向你(注意:因为是单链表,所以你不能指向我),你用手指指向他,这样就形成了一个单链表。...手指就是一个引用,而“我、你、他”就是序列中的元素。“我->你->他”方式就是一个简单单链表,不知道你理解了没有?...,打印每个节点的数据""" cur = self....True 插入节点后,List1 的长度为: 5 遍历并打印整个链表: 2 1 3 4 5 反转整个链表: 5 4 3 1 2 删除头节点: 4 3 1 2 删除尾节点: 4 3

    53520

    接上篇-nginx-http-flv-module更新说明(一)

    那为什么HTTP协议使用反向代理和负载均衡没有这个问题呢?那是因为HTTP请求占用的带宽很有限,负载瞬时可能很高,但是不会太持久。...2017-11-12更新: 今天在笔记本上进行压力测试,用的是srs给的测试工具,而它不支持推mp4文件流,只支持flv格式,结果一测试就出现问题,HTTP方式播放无法正常运行,查了下代码,已经修复bug...2017-12-10更新: 评论中有网友指出不知道如何使用HTTP方式播放直播流,可以查看github上的README.CN.md(https://github.com/winshining/nginx-http-flv-module...经调试,发现是在释放已使用的链表(并不是释放内存,是把内存链表链入一个free指针)时,无限循环了,即已使用的链表形成了环。...不得不佩服nginx-rtmp-module的原作者,内存链表使用了引用计数器,分配和释放对计数器的操作避免了多次释放造成链表环的形成。

    93620

    【初阶数据结构】——带头双向循环链表(C描述)

    实际中使用的链表数据结构,都是带头双向循环链表。 对于带头双向循环链表来说: 首先它是带哨兵位的头结点的,也就是说,它是空表状态的时候,也是有一个头结点存在的(当然它不存储有效数据)。...初始化 大家如果看了上一篇单链表的文章会发现我们在实现单链表的时候其实没有搞初始化单链表的函数。 为什么没有搞呢? 因为不需要,我们实现的是单链表,而且不带头。...那为什么我们今天实现的带头双向循环链表还要搞一个初始化的函数呢?...打印 打印呢也很好搞: 对链表进行遍历,打印每个结点中的数据就行了。...它不能是哨兵位的头结点,既然是带头的链表,那头结点我们肯定不能删. 不过如果我们是把find的返回值传给pos , pos也不会是头结点,因为我们遍历都是从头结点后面开始的.

    10910

    面试题分享---面试八股文

    接着问了为什么这么设计,我表示我从没想过为什么。就连为什么取名为堆栈,我也没想过。 不知道大家注意到没有,全程没有问Go的任何一个问题。我表示,后端的开发都是不问语言的吗?我怕不是面了个假的面试。...也就可以理解,为什么面试官不当场说答案,非要让你自己回去搜索了。 1、链表有环的判断,写伪代码 既然是电话面试,那就不是写伪代码,是说伪代码了。但是,链表不能用for循环吗?...为什么这么设计? 栈的空间是由编译器进行开辟和释放,主要存放局部变量和函数参数。栈的地址方向,我不知道,我是推理的,我之前做过单片机,引脚的都是高位往低位处理。堆刚好和栈相反。...至于为什么这么设计,这是由于大小端来决定的。开始我不知道,后面看资料才知道的。 6、Go的栈大小是多少?最大值是多少?...7、队列实现最优路径 不知道问什么,原来是迷宫地图,唉。 8、两个链表像拉链一样相交,获取这些交点 真不知道,到现在还没搜到答案。一个交点的可以知道,拉链一样的多个交点的,还真不知道。

    69220

    从源码理清 useEffect 第二个参数是怎么处理的

    执行的结果大家应该很容易想到: 111 每次都会打印,因为第二个参数为 undefined。 222 只打印一次,因为第二个参数为 []。...333 打印两次,因为第二个参数有一个依赖,这个依赖在 2s 的时候会变一次。 这些我们都很熟悉了,但是它为什么是这样呢?...hooks 也是基于 fiber 来实现的,它在 fiber 节点上维护了一个链表(memorizedState 属性),用来保存数据,每个 hook 都是从对应的链表元素上存取各自的数据。...比如上面那个组件的 6 个 hook 就对应着 fiber 节点上 memorizedState 链表的 6 个元素: 每个 hook 都是在对应的链表元素上存取数据的。...这个估计很多人都不知道,因为热更新是工具实现的。 我们从源码层面解释清楚了 useEffect 第二个参数的处理机制。

    1.3K20
    领券