js实现反向链表
实现反向链表的方法
迭代法
迭代法是最常见且高效的反转链表方法,通过遍历链表并逐个反转节点指针实现。

function reverseList(head) {
let prev = null;
let current = head;
while (current !== null) {
const nextTemp = current.next;
current.next = prev;
prev = current;
current = nextTemp;
}
return prev;
}
prev用于保存前一个节点,初始化为null。current指向当前节点,初始化为链表头head。- 在循环中,临时保存
current.next,将current.next指向prev,然后更新prev和current为下一个节点。 - 最终返回
prev,即新的链表头。
递归法
递归法通过递归调用反转子链表,再将当前节点连接到反转后的子链表尾部。

function reverseList(head) {
if (head === null || head.next === null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
- 基线条件:链表为空或只有一个节点时直接返回。
- 递归反转
head.next开始的子链表,返回新的头节点newHead。 - 将当前节点
head连接到反转后的子链表尾部(head.next.next = head),并断开原链接(head.next = null)。 - 返回
newHead作为最终结果。
使用栈结构
利用栈的先进后出特性反转链表,适合非原地修改的场景。
function reverseList(head) {
if (head === null) return null;
const stack = [];
let current = head;
while (current !== null) {
stack.push(current);
current = current.next;
}
const newHead = stack.pop();
current = newHead;
while (stack.length > 0) {
current.next = stack.pop();
current = current.next;
}
current.next = null;
return newHead;
}
- 遍历链表并将所有节点压入栈中。
- 弹出栈顶节点作为新链表的头
newHead。 - 依次弹出节点并链接,最后将尾节点的
next置为null。
注意事项
- 迭代法空间复杂度为 O(1),递归法为 O(n)(栈空间)。
- 递归法可能因链表过长导致栈溢出。
- 实际应用中迭代法更常用,递归法代码更简洁。






