(准备面试,多看点题。来自原文)

我想你去很多家公司面试的时候,遇到单链表倒置的问题可能比较多,如果一定要给面试题来一个排名,估计也能上top10吧,其实这个题目玩的是技巧和你对单链表的理解,其实我们仔细想想也不是很难,既然是倒置,那我们一定是一定要走一遍单链表的,对吧,那么走单链表有两种形式,递归和循环两种方式,而递归正是压栈和出栈,那么我们就想起来了,这不就是顺序和逆序的关系吗?第二种就是循环,还记得我们曾今学习单链表的时候有一种插法叫做头插法,这种插入复杂度为O(1),不好的地方就是顺序插入的数字,出来的时候却是反的,所以这个不就是可以将原先的链表原地倒置过来吗?

一:递归

说到递归,我们脑子里面一定要有一个V型图,还有一个就是好记性不如烂笔头,算法这东西很难用脑子想的清楚的,多画画图就见青天了,下面我就举个简单的例子:现有链表L={8,1,6,3},需要将L倒置,然后我就画好了V型图。

从图中可以看到,当我递归到3再出栈的时候,只需要将6赋给3.next,1赋给6.next,然后这样以此类推。。。最后结果就出来了,貌似口头上描述起来很简单,但是在写代码的时候需要注意以下几个点,先上代码说话。

public LinkNode Reverse(LinkNode node)
{if (node.next == null)return node;var prevNode = Reverse(node.next);var temp = node.next;temp.next = node;node.next = null;return prevNode;
}

第一点:我们在走链表的时候,可以操控的只有两个结点,node和node.next,所以递归出口的时候,一定不能使用最常见的写法。

if (node == null)return node;

而应该像下面这么写,其实就告诉我们只需要走到6节点就行了,用6.next来判断下是不是链尾,这样做是方便我们进行node和

node.next进行节点交换。

if (node.next == null)return node;

第二点:当我们每一次出栈的时候,其实也是退到曾今压栈时的方法环境中,进行节点交换的时候,也只能在当前的方法上下文中起效,比如说:出栈到1的时候,其实3和6的节点已经交换了,但是1这个方法环境不知道,它仍然指向6,但此时节点6.next再也不是3了,因为曾今3和6进行了交换,所以这不是我们所期望的,所以在回退的时候,一定要有一个链表保存这个所有节点交换的集合,恰巧在链表中有一个特征就是,只要我有一个指针始终指向头结点的地址,它就相当于一个集合的功能了,因为我不管你后面节点怎么转换,我都可以通过head.next依次找到后面痉挛的所有结点,比如下图中在出栈的过程中,每个出栈的方法环境中都依次交换了node和node.next结点,而我的prevnode始终指向的是结点3,所以我通过3.next就可以找到后面所有的 变化,所以这里就是prevnode的精妙之处。

最后看一下倒置的输出结果:

二:非递归实现

如果你知道头插法,那么循环实现真的很简单,不像递归做法很难想到那个prevnode节点,我们知道头插法是把新节点插入到链表的头部,而我们遍历的时候又可以控制两个节点node和node.next,所以依次采用头插法,将node.next插入到node之前,有人说,那插入到node节点之前不就乱了吗?所以在操作之前,我可以把node.next先保存起来,比如放到申请的一个叫next的节点上,为了保存新转换的节点,我们再申请一个prev结点来保存头插法中的新节点。

为了好理解,画图如下,其实这里要注意,结点还是那些结点,并没有删除再添加。

public LinkNode Reserve(LinkNode node)
{LinkNode prev = null;LinkNode next = null;while (node != null){next = node.next;node.next = prev;prev = node;node = next;}return prev;
}

其实我们发现,代码只有那么一点点,但是信息量还是蛮大的,这些东西要是用口头描述还是很累的。

面试中必知必会的那些题——单链表倒置相关推荐

  1. gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_关于TCP/IP,必知必会的十个问题!...

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 TCP/IP十个问题 一.TCP/IP模型 TCP/IP协议模型(Trans ...

  2. java面试必知必会

    java面试必知必会 面向对象 成员变量成员方法 Integer相关 double 和 Double相关 多态,向上转型 hashcode.==.equals比较 java中子类继承父类时是否继承构造 ...

  3. 软件测试之MySQL数据库必知必会,面试必备

    软件测试之MySQL数据库必知必会,面试必备! 一.前言 1.1 数据库概念及分类 1.2 SQL语句概念及分类 1.3 MySQL数据类型 二.常用SQL语句 2.1 数据库相关SQL 2.2 表相 ...

  4. 在python中、下列代码的输出是什么-Python 面试中 8 个必考问题

    1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list list1 = extendList( ...

  5. tableau必知必会之如何在同一视图中进行相同分析维度图表的切换

    实际业务场景中,你可能会遇到类似的分析需求:多组织架构.多业务线的数据分析,希望能在同一个视图中,通过切换图表,可以快速查看不同层级数据的分析结果. 例如下图,我们将企业总部设置为"板块&q ...

  6. 从《MySQL必知必会》中对MySQL的理解

    MySQL是一个开源的DBMS,是目前主流的关系型数据库DBMS之一.在<MySQL必知必会>中,作者通过简单实用的订单实例简而明要地介绍了MySQL,这里简单汇总. 查询 检索+过滤+排 ...

  7. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  8. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  9. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

最新文章

  1. 又一届Google Cloud Next,李飞飞发布TPU 3.0,两大AutoML新品
  2. zsh与oh-my-zsh
  3. php流媒体视频下载,如何使用PHP流媒体文件?
  4. hive函数参考手册
  5. win7系统的设置在哪里_win10系统改装win7之BIOS设置教程
  6. 与计算机运算速度相关参数,计算机CPU运算速度是多少
  7. 针对form表单赋值封装
  8. 探讨OSPF次优路由选择
  9. 使用Windows聚焦当壁纸
  10. mysql修改字段的名称类型_MySQL修改字段名和字段数据类型
  11. 计算机电源+3c认证,电源适配器要不要做3C认证?怎么做
  12. 论证可行性有哪几个方面
  13. Android 版本号及对应的版本名称
  14. 工大校园邮箱申请流程
  15. Qt--ipad滑屏效果
  16. 蓝蓝算法04-字符串逆置
  17. Mac 下 Docker搭建RAP2 记录
  18. JS实现字符串模糊匹配
  19. 044-Web前端-JS-键盘事件
  20. AISummit全球人工智能技术大会,洞悉AI技术的现在与未来

热门文章

  1. R 回归 虚拟变量na_如何优雅地计算多变量
  2. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...
  3. 【每周论文推荐】 初入深度学习CV领域必读的几篇文章
  4. 【知识星球】数据集板块重磅发布,海量数据集介绍与下载
  5. 全球及中国有机肥料行业投资价值与营销品牌战略报告2022版
  6. 全球及中国嵌入式家电行业销售格局及竞争策略研究报告2021-2027年版
  7. 全球与中国自行车和零件制造市场发展规划及未来投资趋势展望报告2021年版
  8. js实现返回顶部功能的解决方案
  9. BZOJ 1821: [JSOI2010]Group 部落划分 Group【MST】
  10. 洛谷 P2420 让我们异或吧