C++单链表节点结构体定义为struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} },包含数据域和指向下一节点的指针,构造函数确保next初始化为nullptr。

怎么定义 C++ 单链表节点结构体
单链表的基石是节点(Node),它必须包含两部分:数据域和指向下一个节点的指针。用 struct 最简洁,next 指针类型必须是 Node*,不能是 Node(否则无限嵌套)。
常见错误是忘记初始化 next 为 nullptr,导致野指针;或把指针声明写成 Node* next = nullptr 却放在类外定义里(C++11 后允许,但老编译器可能报错)。
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {} // 构造函数自动置空 next
};怎么实现头插法插入新节点
头插法最简单,无需遍历,时间复杂度 O(1),但插入顺序与输入顺序相反。关键操作是:先让新节点的 next 指向原头节点,再把头指针更新为新节点。
容易漏掉的点:head 是二级指针或引用传参?如果函数参数是 Node* head,修改它不会影响实参——必须传 Node*& head 或 Node** head。
立即学习“C++免费学习笔记(深入)”;
void insertAtHead(Node*& head, int val) {
Node* newNode = new Node(val);
newNode->next = head; // 新节点指向原头
head = newNode; // 更新头指针
}怎么安全删除值为 x 的第一个节点
删除操作必须处理三种情况:空链表、删头节点、删中间/尾节点。核心是「找到前驱」,而不是直接找目标节点——因为要改前驱的 next 字段。
常见坑:
- 忘记检查 head == nullptr 直接访问 head->data → 段错误
- 删除头节点后没更新 head,导致内存泄漏+逻辑错乱
- 用 while (curr != nullptr && curr->data != x) 时,循环退出后 curr 可能为空,没判就解引用
void deleteFirstOccurrence(Node*& head, int x) {
if (!head) return;
if (head->data == x) { // 头节点匹配
Node* tmp = head;
head = head->next;
delete tmp;
return;
}
Node* prev = head;
Node* curr = head->next;
while (curr && curr->data != x) {
prev = curr;
curr = curr->next;
}
if (curr) { // 找到了
prev->next = curr->next;
delete curr;
}
}为什么建议用智能指针替代 raw pointer
手写 new/delete 容易漏删、重复删、异常中断导致泄漏。用 std::unique_ptr 能自动管理生命周期,但需注意:next 字段也得是 unique_ptr,且不能有循环引用(单链表天然无环,没问题)。
代价是:每次访问 next 得用 ->(如 curr->next->data),且不能直接赋值裸指针给它;调试时看堆栈不如裸指针直观。
如果你在写教学代码或 OJ 题,裸指针更轻量;如果是工程级链表容器,优先考虑 std::list 或封装好的智能指针版本。










