Back to Blog

【面试】4.单链表的反向

  • 初始化p1 指向原头节点,p2 指向第二个节点;把原头节点的 next 设为 NULL,为后面的翻转做准备。
  • 循环体:先保存 p2 的后继 (p1 = p2->next);再把 p2->next 指向当前的 head(已经翻转好的部分);随后把 head 更新为 p2,相当于把 p2 插入到已翻转链表的最前端;最后把 p2 移动到 p1(即原链表的下一个节点)。
  • 终止条件:当 p2NULL 时,说明所有节点都已经处理完毕。

2.3 复杂度分析

  • 时间复杂度O(n),遍历一次链表即可完成翻转。
  • 空间复杂度O(1),仅使用了常数个指针变量。

2.4 常见错误与调试技巧

错误情形可能原因解决办法
程序运行后链表出现环p2->next=*head 前未正确保存 p2->next确保在修改指针前先保存后继节点 (p1 = p2->next)
逆序后头指针仍指向原头节点未把 *head 更新为 p2检查 *head = p2; 语句是否被遗漏
空链表(head == NULL)导致崩溃未对空指针做保护在函数入口加入 `if (!head

3. 方法二:利用栈的先进后出特性

3.1 思路概述

栈(std::stack)天然具备 后进先出(LIFO)的特性。将链表的所有节点依次压入栈中后,弹出时的顺序正好是原链表的逆序。通过遍历栈并重新链接节点,即可得到翻转后的链表。

3.2 代码解析