反转链表
单链表反转是数据结构中的经典面试题,核心在于理解指针操作。本文对比了两种主流解法:原地反转指针与头插法构建新链表。两者时间复杂度均为 O(n),空间复杂度为 O(1)。实现关键在于遍历过程中正确保存后继节点,防止链表断裂。
题目描述
给定一个单链表的头节点 head,要求反转原链表并返回新的头指针。需要满足以下约束:
- 时间复杂度为
O(n) - 空间复杂度为
O(1)

方法一:原地反转指针
这是最直观的思路。遍历一遍链表,将当前节点的 next 指针指向其前驱节点,即可实现反转。最终返回原链表的尾节点(即新链表的头节点)。
核心逻辑
- 边界处理:如果
head为空,直接返回nullptr。 - 指针定义:
curNode:当前遍历的节点,初始为head。curPrev:当前节点的前驱节点,初始为nullptr。curNext:当前节点的后继节点,用于暂存,防止断链。
- 遍历过程:
- 在循环内先保存
curNext,因为修改curNode->next后会丢失后续路径。 - 执行反转:
curNode->next = curPrev。 - 移动指针:
curPrev和curNode依次向后移。
- 在循环内先保存
- 结束条件:当
curNode为空时,curPrev即为新链表的头节点。
注意:在
while循环内部保存curNext是最稳妥的方式。这样能保证curNode一定不为空,避免了对空指针的解引用风险。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* curNode = head;
ListNode* curPrev = nullptr;
(curNode) {
ListNode* curNext = curNode->next;
curNode->next = curPrev;
curPrev = curNode;
curNode = curNext;
}
curPrev;
}
};


