之前学习了关于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. charles 白名单

    本文参考:charles 白名单 charles 白名单 白名单工具,允许您阻止除选定位置之外的所有请求. 注意:如果一个请求与"黑名单"和"白名单"同时匹配成 ...

  2. Egret入门学习日记 --- 第二十篇(书中 9.1~9.3 节 内容 组件篇)

    第二十篇(书中 9.1~9.3 节 内容 组件篇) 第八章中的内容. 以上都是基本的Js知识,我就不录入了. 直接来看 第9章. 开始 9.1节. 以上内容告诉你,Egret官方舍弃了GUI,使用了E ...

  3. Zuul1与Spring Cloud Gateway对比

    一.API网关 1.1 Zuul1简介 1.2 Spring Cloud Gateway简介 二.对比 2.0 产品对比 2.1 性能对比 2.1.1 低并发场景 2.1.2 高并发场景 2.1.3 ...

  4. 最新 找钢网java校招面经 (含整理过的面试题大全)

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

  5. 根据start和limit从已有的数据列表中获取从start开始的limit个数据

    代码记录(需求:根据start和limit从已有的数据列表中获取从start开始的limit个数据) 已有的数据列表:这个数据列表是经过处理的,可能是在SQL查询时无法处理的如多条件排序,而排序条件需 ...

  6. MySQL5.7.9安装与配置优化

    一. 环境准备 1. 下载软件包 wget http://test.hexin.cn/software/mysql-5.7.9.tar.gz -P /usr/local/src/ wget http: ...

  7. C++中pair详解

    pair是定义在<utility>中的生成特定类型的模板,它的作用是把一组数据合并为一体,实际上是一个拥有两个成员变量的struct. 创建一个pair对象时,需要提供两个数据类型(不要求 ...

  8. SpringBoot(三)手写starter pom自动配置

    思想:主要是EnableAutoConfiguration在启动的时候会扫描spring.factories并加载 1在resource下面新建META-INF/spring.factories 2在 ...

  9. Max coverage disjoint intervals

    Assume you have k<=10^5 intervals [a_i, b_i] \in [1,10^18] (some of them may overlap), and you ne ...

  10. 【坑】mysql 8.0以后的驱动 jar、连接池的变化

    文章目录 前言 com.mysql.cj.jdbc.Driver 后记 前言 博主公司刚配置了新电脑,安装开发环境的时候,美滋滋的将开发工具都装了新版本,结果在使用 mysql 的时候,发现一直链接数 ...