LeetcodeLeetCode算法

JS优雅实现反转一个单链表

2018-03-11  本文已影响14人  Mr_Alpha

Reverse Linked List
反转一个单链表。
LeetCode连接:https://leetcodechina.com/problems/reverse-linked-list/description/

使用递归的方式。

优势:

  1. 借用JS强大的闭包功能
  2. 只需遍历一遍链表

缺点:
递归的缺点:占空间

思路:

  1. 递归的基线条件:遍历到末节点(node.next === null)
  2. 递归的递归条件:node.next !== null
  3. 当遇到末节点时,返回末节点,前一节点接收末节点,并把末节点的next设置为自身,返回前一节的,继续下去
  4. 考虑特殊情况:undefined和null

直接贴代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
    // 闭包
    if (head === undefined || head === null) return null
    var originalHead = head
    var reverseHead
    var reverse = function (head) {
        if (head.next === null) {
            reverseHead = head
            return head
        } else {
            var node = reverse(head.next)
            node.next = head
            if (originalHead === head) {
                head.next = null
                return reverseHead
            } else {
                return head
            }
        }
    }
    return reverse(head)
};

运行时间如下,小于100ms:


image.png
上一篇下一篇

猜你喜欢

热点阅读