leetcode 反转链表(每日计划)

83 阅读1分钟

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

我的算法实现:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
  // 保存最后一个节点用
  let tempHeader;
  // 如果传进来的是 null 直接返回
  if (!head) {
    return null;
  } else if (!head.next) { // 如果只有一个节点也直接返回
    return head;
  }
  // 递归
  const _reverse = (node) => {
    // 如果是 node.next.next 都为空了,此时的最后一个节点是 node.next
    if (node.next.next === null) {
      tempHeader = node.next;// 保存最后一个节点
    } else {
      // 如果不是最后一个节点就一直进行下去
      _reverse(node.next);
    }
    // 处理反转 如果是最后一个节点,让它的下一个节点指向前一个节点
    node.next.next = node;
  };
  _reverse(head);
  // 完成以后把第一个节点指向 null
  head.next = null;
  return tempHeader;
};

这次我特意使用递归的方式写这道题目,特意练习一下,所以花费的时间有点多。再加上突然自己在公司写的 bug 暴露了,于是不得不修复 bug ,最后弄得这么晚。

思路就是保存两个节点,然后让后一个节点指向前一个节点,所以在刚开始的地方我就处理了空节点和只有一个节点的情况。

我看了看官方的讲解更好,代码一如既往的简单,可读性强:反转链表

利用好递归的返回值是非常好的。


来源:力扣(LeetCode)