反转单向链表的两种方法

653 阅读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;
 * }
 */

方法一:

  • 定义一个空的前节点
  • 定义一个指向头节点的迭代指针
  • 遍历迭代指针,将当前节点的next节点备份
  • 将当前节点的next指向刚定义的前节点
  • 移动前节点到当前节点,移动当前节点到next节点
  • 最后返回的是前节点指针

代码:

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
  let pre = null;
  let cur = head;
  while (cur) {
    let next = cur.next;
    cur.next = pre;
    pre = cur;
    cur = next;
  }
  return pre;
};

方法二:

递归,每次只把当前的节点指向关系进行反转。

代码:

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
  if (head === null || head.next == null) {
    return head;
  }

  let next = reverseList(head.next);
  head.next.next = head;
  head.next = null;
  return next;
};