迭代和递归 - leetcode 206. Reverse Linked List

时间:2021-12-28 00:07:22

Reverse Linked List,一道有趣的题目。给你一个链表,输出反向链表。因为我用的是JavaScript提交,所以链表的每个节点都是一个对象。例如1->2->3,就要得到3->2->1

1、数组构造


一个很容易想到的方法是用数组保存新构造每个节点,然后反向构造链表,输出:

var reverseList = function(head) {
  var ans = [];

  while (head) {
    var node = new ListNode(head.val);
    ans.push(node);
    head = head.next;
  }

  ans.reverse();

  if (!ans.length)
    return null;

  for (var i = 0, len = ans.length; i < len - 1; i++) {
    ans[i].next = ans[i + 1];
  }

  return ans[0];
};

虽然能AC,但是浪费了空间,我们幻想能不能直接把指针指向扭转过来?

2、迭代


迭代的精髓在于按顺序对指针指向的扭转。以1->2->3->4为例,当迭代到第三次时,前面的运算已经保存了一个pre值,值为2->1,这时到3这个节点,只需把它的指向指到pre即可,而构成的新的链表3->2->1保存为pre以供下次迭代,但是因为它后面的值还要做运算,所以把它原先的指向先保存起来(为next),为了下次继续迭代:

var reverseList = function(head) {
  var pre = null;

  while (head) {
    var next = head.next;
    head.next = pre;
    pre = head;
    head = next;
  }

  return pre;
};

3、递归


递归是迭代的好兄弟,这道题的递归很巧妙,想起来也有点复杂。

var reverseList = function(head) {
  if (head === null || head.next === null)
    return head;

  var next = head.next;
  head.next = null;
  var newHead = reverseList(next);
  next.next = head;

  return newHead;
};

递归的精髓在于将next当做参数传入reverseList函数时,在下一次递归中对参数的操作,会反应在上次的参数值上。

还是以1->2->3->4举例子,4次递归后(回溯前),其实是将引用链全部打破:

1      2      3      4
|      |      |      |
null   null  null   null

然后再添加反向的引用链,思路巧妙无法言喻。

迭代和递归 - leetcode 206. Reverse Linked List的更多相关文章

  1. leetcode 206&period; Reverse Linked List&lpar;剑指offer16&rpar;、

    206. Reverse Linked List 之前在牛客上的写法: 错误代码: class Solution { public: ListNode* ReverseList(ListNode* p ...

  2. &lbrack;LeetCode&rsqb; 206&period; Reverse Linked List 反向链表

    Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...

  3. LeetCode 206&period; Reverse Linked List&lpar;C&plus;&plus;&rpar;

    题目: Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4 ...

  4. &lbrack;LeetCode&rsqb; 206&period; Reverse Linked List &star;&lpar;反转链表&rpar;

    Reverse Linked List 描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL    输出: 5->4->3-> ...

  5. &lbrack;LeetCode 206&rsqb; Reverse Linked List 翻转单链表

    本题要求将给定的单链表翻转,是校招面试手撕代码环节的高频题,能很好地考察对单链表这一最简单数据结构的理解:可以使用迭代和递归两种方法对一个给定的单链表进行翻转,具体实现如下: class Soluti ...

  6. LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(&ast;)

    翻译 反转一个单链表. 原文 Reverse a singly linked list. 分析 我在草纸上以1,2,3,4为例.将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致 ...

  7. LeetCode 206&period; Reverse Linked List&lpar;迭代和递归两种实现&rpar;

    递归的代码比迭代的代码看起来更清爽一些,也是由于递归对行为进行了抽象吧. 注意到,这是一个尾递归函数.一些编译器会将它优化为迭代,这样一方面,在代码层面保持了清晰的逻辑和可读性.一方面保持了代码的性能 ...

  8. Java &lbrack;Leetcode 206&rsqb;Reverse Linked List

    题目描述: Reverse a singly linked list. 解题思路: 使用递归或者迭代的方法. 代码如下: 方法一:递归 /** * Definition for singly-link ...

  9. C&plus;&plus;版 - 剑指offer 面试题16:反转链表&lpar;Leetcode 206&colon; Reverse Linked List&rpar; 题解

    面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...

随机推荐

  1. ubuntu安装配置elasticSearch&lpar;vagrant&rpar;

    安装jdk sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java s ...

  2. clang LLVM 介绍和安装(Ubuntu10 64位&rpar;

    http://www.csdn.net/article/2013-11-27/2817632 的对Stanley B.Lippman采访提到clang的一些优点,以前程序员杂志也写过,为了提高系统的性 ...

  3. remoting blazeds 实施步骤

    remoting 实施步骤 1.创建 --web project 和 -- Flex project 2.在web project 下创建 -- com.HelloRemoting: package ...

  4. &num;学号 20175201张驰 《Java程序设计》第2周学习总结

    教材学习内容总结: 一.第二章: 1:标识符与关键字 2:基本数据类型:四种整数类型(byte.short.int.long).两种浮点数类型(float.double).一种字符类型(char).一 ...

  5. 使用h2数据库

    h2数据库提供了一个简单的web管理界面 import org.h2.tools.Server; import org.slf4j.Logger; import org.slf4j.LoggerFac ...

  6. lecune入门示例

    注意:本示例中的lucene版本需在jdk7以上使用. 一.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&quot ...

  7. cdnbest如何在站点里开启强制缓存

    在站点设置中如下图设置: 强制缓存有两种方式,一种是文件类型,一种是url方式

  8. nginx 配置文件配置

    server { listen 80 ; server_name test.com www.test.com; index index.html index.php index.htm; root / ...

  9. js &equals;&equals;和&equals;&equals;&equals;以及!&equals; 和 !&equals;&equals;的区别

    一.js == 与 === 的区别[转] 1. 对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型 ...

  10. 四则运算web版

    1)在文章开头给出Coding.Net项目地址.(1') https://git.coding.net/meiyoupiqidefan/jieduizuoye.git url测试地址:http://3 ...