如何使用递归和非递归方式反转单向链表

   2015-08-23 0
核心提示:以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下

问题:
给一个单向链表,把它从头到尾反转过来。比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a 。

分析:
假设每一个node的结构是:

复制代码 代码如下:

class Node {
 char value;
 Node next;
}

因为在对链表进行反转的时候,需要更新每一个node的“next”值,但是,在更新 next 的值前,我们需要保存 next 的值,否则我们无法继续。所以,我们需要两个指针分别指向前一个节点和后一个节点,每次做完当前节点“next”值更新后,把两个节点往下移,直到到达最后节点。

代码如下:
复制代码 代码如下:

public Node reverse(Node current) {
 //initialization
 Node previousNode = null;
 Node nextNode = null;

 while (current != null) {
  //save the next node
  nextNode = current.next;
  //update the value of "next"
  current.next = previousNode;
  //shift the pointers
  previousNode = current;
  current = nextNode;   
 }
 return previousNode;
}

上面代码使用的是非递归方式,这个问题也可以通过递归的方式解决。代码如下:
复制代码 代码如下:

public Node reverse(Node current)
 {
     if (current == null || current.next == null) return current;
     Node nextNode = current.next;
     current.next = null;
     Node reverseRest = reverse(nextNode);
     nextNode.next = current;
     return reverseRest;
 }

递归的方法其实是非常巧的,它利用递归走到链表的末端,然后再更新每一个node的next 值 (代码倒数第二句)。 在上面的代码中, reverseRest 的值没有改变,为该链表的最后一个node,所以,反转后,我们可以得到新链表的head。

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • delphi 递归的方法
    关于递归,我个人有个肤浅的认识,就是在函数或者过程中调用自身。比如下面的代码,用递归的方法遍历磁盘文件,找到QQ.exe然后删掉。procedure FindFile(Dir: String); // 自定义过程; var   Str: TSearchRec; // 是delphi为我们定义好的一个记录类型。
    02-09
  • Ruby-递归和尾递归 尾递归 迭代
    递归和迭代的区别递归:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B. 1、斐波那契 1 1 2 3 5 8     递归
    02-09
  • 递归算法之不用乘号的乘法——用位移实现乘法(
      前两天突发奇想,写一个乘法的实现,但不用乘号*。并测试一下性能如何。因此就有了下面的代码:(本文主要目的是为了玩递归和位移,因此仅限自然数)首先,标准乘法:1 int commonMultiplication(int a, int b) = a * b;第二,从数学的角度,乘法其实就是
    02-09
  • Java实现递归查询树结构的示例代码 java递归组
    目录一、jar依赖二、树节点数据类三、构建树形类四、测试案例我们在实际开发中,肯定会用到树结构,如部门树、菜单树等等。Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。今天,咱们就来说说怎么样将List集合转换成Tre
  • 深入理解PHP之数组(遍历顺序) php递归函数遍历数组
    深入理解PHP之数组(遍历顺序) php递归函数遍历
    作者: Laruence本文地址: http://www.laruence.com/2009/08/23/1065.html转载请注明出处经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢?比如:?php$arr[‘laruence’] = ‘huixinchen’;$arr[‘yahoo’] = 20
    02-09
  • C#实现FFT(递归法) 茶杯狐
    C#实现FFT(递归法)1. C#实现复数类我们在进行信号分析的时候,难免会使用到复数。但是遗憾的是,C#没有自带的复数类,以下提供了一种复数类的构建方法。复数相比于实数,可以理解为一个二维数,构建复数类,我们需要实现以下这些内容:复数实部与虚部的属性
    02-09
  • Delphi下遍历文件夹下所有文件的递归算法
    {-------------------------------------------------------------------------------过程名:    MakeFileList 遍历文件夹及子文件夹参数:      Path,FileExt:string   1.需要遍历的目录 2.要遍历的文件扩展名返回值:    TStringListUSE StrUtils 
    02-09
  • lua 使用递归查找键值
    function cc.exports.findValueByTbl(tbl,key)--递归方法,用于查找tbl中对应的键值    for k,v in pairs(tbl) do        if k == key then            if type(tbl[i])=="table" then--如果是table类型,递归查找                return
    02-08
  • NodeJS用递归实现异步操作的链式调用,完成一个简易的命令行输入输出REPL交互接口
    NodeJS用递归实现异步操作的链式调用,完成一个
    REPL —— Read-Eval-Print-Loop.00.一门好的编程语言的必要条件REPL并不是什么高大上的东西,简单的说就是一个从命令行程序,读取终端输入,处理,打印结果,如此循环。这是一门比较全面的编程语言的基础。刚开始接触NodeJS,以为就是一个服务端Js,但学习了
    02-08
  • nodejs递归创建目录 如何递归创建目录
    var fs = require("fs");var path = require("path");// 递归创建目录 异步方法function mkdirs(dirname, callback) {fs.exists(dirname, function (exists) {if (exists) {callback();} else {// console.log(path.dirname(dirname));mkdirs(path.dirname(di
    02-08
点击排行