删除单向链表指定值节点需先找前驱,头节点要单独处理并更新head;按索引删需校验边界、用i=index-1找前驱;delete后须置空指针防野指针;仅传节点指针无法删除,因无前驱且参数值传递。
删除单向链表中指定值的节点
必须先遍历找到目标节点的前驱,不能直接用 delete 当前节点指针后就结束——否则会丢失前驱对后续节点的连接。典型错误是删掉头节点后没更新 head 指针,导致整个链表“消失”。
实操要点:
- 单独处理头节点:若
head->val == target,需执行head = head->next; delete old_head; - 非头节点:用
prev和curr双指针遍历,找到后执行prev->next = curr->next; delete curr; - 找不到时要检查
curr == nullptr,避免解引用空指针
按位置索引删除节点(如第n个)
索引从 0 开始更符合 C++ 习惯,但容易错算边界。删第 0 个就是删头节点;删第 size 个则越界——必须提前校验 index = size。
关键细节:
立即学习“C++免费学习笔记(深入)”;
- 遍历时用计数器
i匹配index - 1找前驱(不是index),否则会多走一步 - 如果链表为空(
head == nullptr),任何索引都非法,应直接返回 - 删完记得
size--(如果你维护了长度字段)
释放节点内存时常见的野指针问题
delete ptr 只释放内存,不自动把 ptr 设为 nullptr。之后若再次解引用该指针(比如误判为未删除),就是未定义行为,调试极难定位。