1. 链表反转问题概述
链表反转是数据结构与算法中的经典问题,也是技术面试中的高频考点。这个问题看似简单,却能够很好地考察程序员对指针操作的理解程度。在实际工作中,链表操作是构建更复杂数据结构的基础,掌握链表反转的技巧对处理各种链表相关问题大有裨益。
链表反转的核心在于改变节点间的指向关系。原始链表中每个节点的next指针指向下一个节点,反转后则需要让每个节点的next指向前一个节点。这个过程需要注意指针操作的顺序,否则很容易出现节点丢失或者形成环状链表的情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 迭代法实现链表反转
2.1 迭代法基本思路
迭代法是解决链表反转问题最直观的方法。其基本思路是:遍历原始链表,逐个改变节点的next指针指向,同时维护好未处理部分的链表结构。具体实现需要三个指针:
- prev:指向已反转部分的头节点
- curr:当前正在处理的节点
- next:保存curr的下一个节点,防止链表断裂
提示:在开始反转前,prev应初始化为nullptr,因为反转后的链表最后一个节点的next应该指向空。
2.2 迭代法完整实现代码
cpp复制ListNode* reverseList(ListNode* head) {
ListNode *prev = nullptr;
ListNode *curr = head;
while (curr != nullptr) {
ListNode *next = curr->next; // 保存下一个节点
curr->next = prev; // 反转当前节点的指针
prev = curr; // prev移动到当前节点
curr = next; // curr移动到下一个节点
}
return prev; // 最后prev成为新链表的头节点
}
2.3 迭代法执行过程分析
让我们通过一个具体例子来理解迭代法的执行过程。假设原始链表为1→2→3→4→5→nullptr:
- 初始化:prev = nullptr, curr = 1
- 第一次循环:
