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

 更新时间:2013年07月19日 12:16:08   作者:  
以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下

问题:
给一个单向链表,把它从头到尾反转过来。比如: 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。

相关文章

  • C语言实现绘制绕线画的示例代码

    C语言实现绘制绕线画的示例代码

    绕线画简单点来说,就是在木板上钉一圈钉子,通过绕线进行构图,最终呈现出一幅图像。本文将用C语言实现这一效果,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • C语言基础知识分享续篇

    C语言基础知识分享续篇

    这篇文章主要介绍了C语言基础知识分享续篇的相关资料,需要的朋友可以参考下
    2023-01-01
  • C++常量详解二(常量形参,常量返回值,常量成员函数)

    C++常量详解二(常量形参,常量返回值,常量成员函数)

    这篇文章主要介绍了C++常量详解二(常量形参,常量返回值,常量成员函数),需要的朋友可以参考下
    2017-06-06
  • C/C++中的atan和atan2函数实例用法

    C/C++中的atan和atan2函数实例用法

    在本篇文章里小编给大家分享的是一篇关于C/C++中的atan和atan2函数实例用法相关内容,有兴趣的朋友们可以学习下。
    2020-02-02
  • 详解C++ 参数的三种传递方式和应用场景

    详解C++ 参数的三种传递方式和应用场景

    这篇文章主要介绍C++ 参数的三种传递方式和应用场景,C++ 参数的三种传递方式分别是值传递、指针传递和引用传递,感兴趣的同学可以参考阅读下
    2023-06-06
  • C++深浅拷贝和写时拷贝图文详解

    C++深浅拷贝和写时拷贝图文详解

    这篇文章主要给大家介绍了关于C++深浅拷贝和写时拷贝的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用C语言求N的阶乘的方法

    使用C语言求N的阶乘的方法

    这篇文章主要介绍了使用C语言求N的阶乘的方法,包括一道相关的ACM题目示例,需要的朋友可以参考下
    2015-08-08
  • 在C++17中实现无锁数据结构的方法详解

    在C++17中实现无锁数据结构的方法详解

    在探索 C++17 中的无锁数据结构之前,我们首先需要理解无锁编程的基本概念及其在现代软件开发中的重要性,在这个章节中,我们将深入探讨无锁编程的概念,以及它如何满足人类对于更高效、更可靠软件的本能需求,文中通过代码示例介绍的非常详细,感兴趣的朋友可以参考下
    2023-12-12
  • c++ string的erase删除方法

    c++ string的erase删除方法

    这篇文章主要介绍了c++ string的erase删除方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C语言实现天气信息管理系统

    C语言实现天气信息管理系统

    这篇文章主要介绍了C语言实现天气信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06

最新评论