0.反转链表核心代码

链表反转的核心动作只有一件事:

cur.next = prev;

也就是把当前节点 curnext 指针,改成指向它前面的节点 prev

核心模板

let prev = null;
let cur = head;

while (cur !== null) {
  const next = cur.next; // 1. 先保存下一个节点
  cur.next = prev;       // 2. 反转当前节点的指向
  prev = cur;            // 3. prev 向前移动
  cur = next;            // 4. cur 向前移动
}

循环结束后:

prev

就是反转后的新头节点。

完整实现

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
  let prev = null;
  let cur = head;

  while (cur !== null) {
    const next = cur.next;
    cur.next = prev;
    prev = cur;
    cur = next;
  }

  return prev;
};

为什么要先保存 next

反转前:

prev   cur   next
null    1 -> 2 -> 3

如果直接执行:

cur.next = prev;

节点 1 就会变成:

1 -> null

这时如果没有提前保存 2,后面的链表就找不到了。

所以必须先写:

const next = cur.next;

再修改:

cur.next = prev;

记忆方式

每次循环只记住四步:

保存下一个
反转当前指针
prev 前进
cur 前进

对应代码:

const next = cur.next;
cur.next = prev;
prev = cur;
cur = next;