01. C++实现单向链表反转的高效实现思路
01.1 迭代法的三指针更新要点
核心思路是在 C++ 中使用三指针:prev、curr、next,通过逐步把 curr 的 next 指针 指向 前驱节点,从而完成链表的翻转。
初始设定:将 prev 指向 nullptr,curr 指向头结点,这样在遍历时可以安全改写指针关系,并逐步构建反转后的链表。
循环终止:当 curr 变为 nullptr 时,反转完成,此时新的头结点应指向 prev。
struct ListNode {int val;ListNode* next;ListNode(int x): val(x), next(nullptr) {}
};// Iterative reverse
ListNode* reverseList(ListNode* head) {ListNode* prev = nullptr;ListNode* curr = head;while (curr) {ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;
}
01.2 边界条件与正确性保障
空链表处理:若头结点为 nullptr,直接返回 nullptr,以避免空指针访问。
单节点情况:当链表仅有一个节点时,反转结果应仍然是该节点自身,curr 在首次循环后即变为 nullptr,返回 prev 即可。

多节点情形:循环每次把当前节点的 next 指向上一个节点,确保整条链路在迭代中逐步建立新的方向。
02. C++实现单向链表反转的对比与扩展
02.1 递归法与迭代法的对比
在 C++ 实现单向链表反转时,递归法提供了更简洁的代码结构,但会带来 栈空间消耗,导致在较长链表上存在 栈溢出风险,其时间复杂度仍为 O(n),空间复杂度则为 O(n)(递归栈)。
相比之下,迭代法始终保持 O(1) 空间复杂度,更适合作为面试题的高效解法,尤其是在受限环境中更稳健。
ListNode* reverseListRecursive(ListNode* head) {if (!head || !head->next) return head;ListNode* p = reverseListRecursive(head->next);head->next->next = head;head->next = nullptr;return p;
}
面试场景:在面试中,常通过对比两种实现方式来考查应聘者对指针、边界条件以及空间时间复杂度的理解,高效解法的迭代实现往往更实用。
03. 面试题的变体与技巧
03.1 处理环路与复杂指针结构
有些题目会给出环形链表或带有哑节点的结构,需在反转前进行 环路检测,以避免造成无限循环,常用的判断方法包括 Floyd 判圈算法等。
在包含哑结点或虚拟头结点的情况下,使用 哑结点技巧 可以统一边界处理,使反转逻辑更简单、健壮。
边界覆盖率:在实际题解中,要确保空链表、单节点、两三节点、以及多节点情况都能正确工作,避免遗漏边界条件。
// 只演示边界处理思路,真实题解应结合具体输入结构
ListNode* reverseListWithDummyHead(ListNode* head) {ListNode dummy(0);dummy.next = head;ListNode* prev = nullptr;ListNode* curr = head;while (curr) {ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;
} 

