反转链表
- 反转链表链接
- 代码即解析
- 结构体(链表定义)
- 为什么需要这样的结构?
- 为什么需要 cur 而不是直接用 head?
反转链表链接
代码即解析
#include <iostream>// 定义链表节点结构
struct ListNode { // 定义名为 ListNode 的结构体(链表节点)int val; // 节点存储的值(比如整数)ListNode* next; // 指向下一个节点的指针ListNode(int x) : val(x), next(nullptr) {} // 构造函数
};// 反转链表函数(头插法)
ListNode* reverseList(ListNode* head) {ListNode* rphead = nullptr; // 新链表的头节点ListNode* cur = head; // 当前遍历节点while (cur != nullptr) {ListNode* nextNode = cur->next; // 保存下一个节点防止断链cur->next = rphead; // 将当前节点的next指向新链表的头rphead = cur; // 更新新链表的头为当前节点cur = nextNode; // 移动到原链表的下一个节点}return rphead; // 返回反转后的头节点
}// 打印链表
void printList(ListNode* head) {ListNode* cur = head;while (cur != nullptr) {std::cout << cur->val << " ";cur = cur->next;}std::cout << std::endl;
}// 释放链表内存(防止内存泄漏)
void deleteList(ListNode* head) {while (head != nullptr) {ListNode* temp = head;head = head->next;delete temp;}
}int main() {// 创建链表 1->2->3->4ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);// 打印原链表std::cout << "原链表: ";printList(head); // 输出 1 2 3 4// 反转链表ListNode* reversedHead = reverseList(head);// 打印反转后的链表std::cout << "反转后: ";printList(reversedHead); // 输出 4 3 2 1// 释放内存deleteList(reversedHead);return 0;
}
结构体(链表定义)
- 结构体是什么?
作用:结构体是一种自定义的数据类型,可以把多个变量打包成一个整体。
类比:想象一个「快递包裹」,里面包含:
物品内容(对应val,存储值)
下一个包裹的地址(对应next,指向下一个节点) - 构造函数 ListNode(int x)
作用:创建节点时,快速初始化节点值val和指针next。
分解解释:
ListNode(int x) : val(x), next(nullptr) {}
- ListNode(int x):构造函数,接收一个整数x作为参数。
- val(x):将参数x赋值给当前节点的val。
- next(nullptr):将next指针初始化为nullptr(空指针)。
为什么需要这样的结构?
动态长度:链表可以按需扩展或缩短,无需预先分配固定内存。
高效增删:只需修改指针指向,即可在任意位置插入或删除节点。
为什么需要 cur 而不是直接用 head?
避免丢失头节点
链表特性:链表的访问必须从头节点开始。如果直接用 head 遍历链表,遍历结束后 head 会指向链表末尾(nullptr),导致无法再次访问链表。