之前学习了关于reverse数组相关的东东(http://www.cnblogs.com/webor2006/p/6727419.html),这次再来对链表进行reverse一下,在面试中也很容易被问到,而对于reverse链表有两种实现方式:递归方式和非递归方式,下面具体来实现下。

递归方式:

首先先来挼一下实现思路,假如有个链表如下:

实现思路就是永远都是取出头结点的第二个结点将它的next指向head结点,然后再将head结点的next指向null,对应上面这个链表就是:

而如果发现node2之后还有结点,则继续按上面的规则递归,直到碰到一个结点的next为null,也就是node3时则直接返回新的头接点,如下:

而图中由于node3的next为null,所以直接返回它,也就是新的链表的头,到此就实现了通过递归方式达到reverse的目的,有了思路之后下面看具体代码实现,还是基于之前链表的代码(http://www.cnblogs.com/webor2006/p/6659211.html)进行实现,先看一下目前的运行结果:

运行结果:

加上reverse的代码:

编译运行:

对于这个递归的方法它的时间复杂度是多少呢,下面来分析一下:

也就是T(0)、T(1)时为O(1)。

也就是

T(n) = T(n-1) + O(1) = T(n-2) + O(1) + O(1) = T(n-3) + 3 * O(1) = .... = n * O(1) = O(n)

非递归方式:

总的思路是比较简单的,也就是循环遍历,每次都改相临的两个元素的关系,直到遍历完成,这里直接贴出实现代码:

运行结果:

而它的时间复杂度也是O(n),随着元素的增加时间成本也会增加

总结:对于以上两个实现方式,效率基本上是差不多的,只是说对于实现方式来说第一种更加容易实现,第二种非递归的方式加了一些临时变量可能在面试时写起来麻烦一些~

Reverse链表的更多相关文章

  1. Reverse链表 递归实现

    #include<iostream> struct node{ int payload; node* next; }; void bianli(node* head){ node* ite ...

  2. Reverse链表 非递归实现

    #include<iostream> struct node{ int payload; node* next; }; void bianli(node* head){ node* ite ...

  3. Leetcode92: Reverse Linked List II 翻转链表问题

    问题描述 给定一个链表,要求翻转其中从m到n位上的节点,返回新的头结点. Example Input: 1->2->3->4->5->NULL, m = 2, n = 4 ...

  4. 链表逆序(JAVA实现)

    题目:将一个有链表头的单向单链表逆序 分析: 链表为空或只有一个元素直接返回: 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继: 重复步骤2,直到q为空: 调整链表头和链表尾: 图 ...

  5. 单链表之C++实现

    在实现单链表时要注意对单链表的逻辑存储.物理存储有清晰的概念. 如上图链表已经完成,其逻辑结构如上.当需要对其进行操作,比如插入.删除,通常需要引 入指针,如上的ptr1.ptr2.在编程时一定要注意 ...

  6. Reverse Nodes in k-Group leetcode java

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  7. C# 链表 --增 -删-反转-删除最小值

    1. Node.cs namespace 链表 { public class Node<T> { public T Data; //这个就是地址 public Node<T> ...

  8. 单链表(C++实现)

    单链表的结构有多种 这里介绍的链表有头结点.有尾节点并且尾节点指向头结点 单链表的每个结点的地址存放在其直接前驱结点的指针域中.其中第一个结点没有前驱结点,因此需要一个头指针指向第一个节点,便于我们对 ...

  9. 算法与数据结构基础 - 链表(Linked List)

    链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...

随机推荐

  1. 区块链学习(四)truffle部署编译智能合约以太坊私有链

    前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04  Truf ...

  2. linux 安装了Linux generic mysql 出错

    在一次安装 Linux generic cmake 出错 提示:CMake Error: The source directory "/usr/local/src" does no ...

  3. Windows服务操作帮助类

    /// <summary> /// 打开系统服务 /// </summary> /// <param name="serviceName">系统 ...

  4. 最新 创梦天地java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.创梦天地等10家互联网公司的校招Offer,因为某些自身原因最终选择了创梦天地.6.7月主要是做系统复习.项目复盘.Leet ...

  5. CenOS 7 安装JDK

    1.输入安装命令 yum install java-1.8.0-openjdk-devel.x86_64

  6. ASP.NET请求过程-Module

    管道模型     上图中为Http请求在Asp.net程序中处理的过程.管道处理模型来自上面的HttpApplication,管道处理模型其实就是多个Module(其实这些module都是在往http ...

  7. 记一次Spring Cloud压力测试

    前言 公司打算举办一场活动,现场参与活动人数比较多.针对于可能访问比较密集的接口进行压力测试.使用jmeter进行测试,请求并发稍微多些,系统就会挂起. 针对压力测试出现的问题,因为并发超过1秒钟10 ...

  8. 通过jquery触发select自身的change事件

    ###通过jquery触发select自身的change事件 1.通过js来去触发select的change事件 代码如下:包含了html部分和js部分 //html部分 <select cla ...

  9. Python print函数详解

    1 """ 2 print(...) 3 print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fals ...

  10. python Django基础操作

    Django常用命令 创建Django项目 Django-admin startprotect  mysite 创建项目以后,以下生成的文件 最外层的file:mysite/ 根目录只是你的项目的容器 ...