Search
链表反转的核心动作只有一件事:
cur.next = prev;
也就是把当前节点 cur 的 next 指针,改成指向它前面的节点 prev。
cur
next
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 向前移动 }
循环结束后:
就是反转后的新头节点。
/** * @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; };
反转前:
prev cur next null 1 -> 2 -> 3
如果直接执行:
节点 1 就会变成:
1
1 -> null
这时如果没有提前保存 2,后面的链表就找不到了。
2
所以必须先写:
const next = cur.next;
再修改:
每次循环只记住四步:
保存下一个 反转当前指针 prev 前进 cur 前进
对应代码:
const next = cur.next; cur.next = prev; prev = cur; cur = next;