单链表反转是将节点指针顺序完全颠倒,使头变尾、尾变头;核心是用prev、curr、next三指针迭代修改next指向,或通过递归处理子问题并调整连接。

什么是单链表反转
单链表反转是指将原链表中节点的指向顺序完全颠倒,使原头节点变成尾节点,原尾节点变成头节点。例如,1 → 2 → 3 → 4 → null 反转后变为 4 → 3 → 2 → 1 → null。核心是逐个修改每个节点的 next 指针,使其指向前一个节点。
用三个指针迭代实现(推荐)
这是最常用、空间复杂度为 O(1) 的方法,只需遍历一次链表,使用 prev、curr、next 三个变量控制指针移动:
-
prev:记录当前节点的前一个节点(初始为
null) - curr:当前正在处理的节点(初始为头节点)
-
next:暂存
curr->next,防止断链
每轮操作:先保存 curr->next,再让 curr->next = prev,然后更新 prev = curr、curr = next,直到 curr 为空。
PHP 完整可运行代码示例
以下是一个简洁、带注释的 PHP 实现(基于标准链表节点类):
立即学习“PHP免费学习笔记(深入)”;
<font size="2"><pre class="brush:php;toolbar:false;">class ListNode {
public $val;
public $next;
public function __construct($val = 0, $next = null) {
$this->val = $val;
$this->next = $next;
}
}
function reverseList($head) {
$prev = null;
$curr = $head;
while ($curr !== null) {
$next = $curr->next; // 保存下一个节点
$curr->next = $prev; // 当前节点指向前一个
$prev = $curr; // prev 前移
$curr = $next; // curr 前移
}
return $prev; // 新头节点是原来的尾节点
}
// 使用示例:
// $list = new ListNode(1, new ListNode(2, new ListNode(3)));
// $reversed = reverseList($list);
递归方式实现(理解逻辑用)
递归解法更体现“子问题”思想:先反转后续节点,再调整当前节点与子链的关系。但要注意递归深度限制和额外栈空间开销(O(n)):
- 递归终止条件:空节点或只有一个节点时直接返回
- 递归调用
reverseList($head->next)得到新头节点 - 让原
$head->next->next = $head,并置$head->next = null
适合理解链表结构本质,实际项目中优先选迭代。











