头插法得逆序链表,尾插法保原序;头插更新head=new_node,尾插须维护tail并更新tail=new_node;空数组时head需初始化为nullptr;链表转数组应先遍历计数再预分配空间。

数组转链表:头插法 vs 尾插法,别搞混指针更新顺序
数组转链表本质是把 a[i] 逐个塞进新节点,但插入方式直接影响链表顺序。头插法得到逆序链表,尾插法保持原序——关键在 head 和 tail 的维护逻辑。
- 头插法:每次新建节点后,让
new_node->next = head,再更新head = new_node;head始终指向最新插入节点 - 尾插法:必须维护一个
tail指针,每次插入后执行tail->next = new_node,再更新tail = new_node;漏掉tail = new_node会导致后续插入全部串到第一个节点后面 - 数组为空时,
head必须初始化为nullptr,否则tail->next会解引用空指针
链表转数组:先遍历计数再分配内存,避免 vector 动态扩容开销
链表无法随机访问,转数组必须先扫一遍确定长度。直接用 vector.push_back() 看似简单,但频繁扩容可能触发多次内存拷贝,尤其链表很长时性能明显下降。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 第一遍遍历:用
while (p != nullptr)统计节点数n - 第二遍遍历:用原始数组或
vector<int> res(n)</int>预分配空间,再用下标i赋值:res[i++] = p->val - 若已知最大长度(如题目限制
N ),直接声明 <code>int arr[N]更快,省去 vector 构造和析构开销
数组模拟链表时的转换陷阱:ne 数组下标不是节点值,e[idx] 才是数据
用 e[N] 和 ne[N] 模拟链表时,“转换”不是字面意义的结构互换,而是逻辑映射。常见错误是把 ne[i] 当作节点值去存进数组,实际它只存下一个节点的下标索引。
-
e[i]存的是第i个“虚拟节点”的数据值,对应真实链表中某个节点的val -
ne[i]存的是整数下标(比如ne[2] = 5表示第 2 号节点指向第 5 号节点),不是地址也不是值 - 从模拟链表转回普通数组:只需按
head → ne[head] → ne[ne[head]] → ...遍历,把每个经过的e[i]提出来即可 - 反向转换(普通数组 → 模拟链表):用
idx依次分配下标,e[idx] = a[i],ne[idx-1] = idx(除首节点外),最后ne[last_idx] = -1
反转链表后再转数组:迭代法比递归更稳,避免栈溢出
如果目标是“反转链表 + 转数组”,不要分两步做(先反转、再遍历转数组)。直接在反转过程中收集值,或用迭代反转后立刻遍历——递归反转在链表很长时容易爆栈,尤其在线上环境栈空间受限。
- 安全做法:用三个指针
prev、curr、next迭代反转,同时用vector或数组缓存curr->val - 错误写法:
reverseList(head); then traverse to array—— 多一次遍历,且没节省代码量 - 注意:反转后的链表头是原尾节点,遍历时从新
head开始,别误用旧head
ne 和 e 的语义分离——它不是“链表转数组”,而是用两组平行数组共同编码链式关系。一旦混淆下标和值,后续所有操作都会错位。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










