如何在单链表中正确地在第二次出现的元素后插入新节点
发布时间 - 2026-01-28 00:00:00 点击率:次本文详解单链表中 `insertaftersecondoccurrence` 方法的逻辑缺陷与修复方案,重点解决因指针误操作导致尾节点被覆盖而非插入的问题,并提供清晰、可运行的修正代码及关键原理说明。
在单链表(Singly Linked List)中实现“在目标元素第二次出现位置之后插入新节点”的功能时,核心在于精确定位插入点前驱节点(即第二次出现的目标节点本身),并正确调整其 next 指针。原代码存在两处关键错误:
- 错误的指针赋值:pred.next = pred; 这行代码使 pred 自环,彻底破坏链表结构;
- 丢失后续连接:未将新节点 tmp 与原插入点之后的子链(即 pred 所指向的部分)重新链接,导致尾部节点被截断。
以示例输入 [7, 5, 3, 50, 7, 9]、调用 insertAfte

✅ 正确做法是:
- 找到第二次出现 e2 的节点 p3;
- 记录其后继节点 pred = p3.next;
- 将新节点 tmp 插入到 p3 和 pred 之间:
p3.next = tmp; // p3 -> tmp tmp.next = pred; // tmp -> pred (原后续链)
完整修正后的关键逻辑段如下(已去除冗余变量与危险操作):
public void insertAfterSecondOccurrence(T e1, T e2) {
if (isEmpty()) {
System.out.println("Error: the list is empty.");
return;
}
// Step 1: Count occurrences of e2
int count = 0;
SLLNode p = head;
while (p != null) {
if (p.info.equals(e2)) count++;
p = p.next;
}
if (count < 2) {
System.out.println("Error: there is no second occurrence.");
return;
}
// Step 2: Locate the second occurrence node (p3)
int count2 = 0;
SLLNode p3 = head;
while (p3 != null) {
if (p3.info.equals(e2)) {
count2++;
if (count2 == 2) break;
}
p3 = p3.next;
}
// Step 3: Insert e1 after p3
SLLNode tmp = new SLLNode<>(e1);
tmp.next = p3.next; // Link to rest of the list
p3.next = tmp; // Insert after p3
} ⚠️ 注意事项:
- 不要修改 tail 指针:除非你明确维护了 tail 引用且确保每次插入都同步更新,否则依赖 tail 反而容易出错;本方法仅操作局部指针,天然兼容任意长度链表;
- 边界安全:p3.next 可能为 null(如第二次出现恰在末尾),但 tmp.next = p3.next 仍合法,此时 tmp 成为新的尾节点;
- 避免自环或空指针:原代码中 pred.next = pred 属严重逻辑错误,务必删除;所有 .next 赋值前无需额外判空,因 tmp.next 可安全接受 null。
总结:链表插入的本质是「断开—重连」——找准前驱,暂存后继,再将新节点夹入中间。理解这一模式,即可稳健处理各类插入场景。
# node
# ai
# red
# NULL
# 指针
# 空指针
# 链表
# 这一
# 为例
# 而非
# 能为
# 再将
# 两处
# 找准
# 这行
# 后应
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel Fortify是什么,和Jetstream有什么关系
中山网站推广排名,中山信息港登录入口?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何用虚拟主机快速搭建网站?详细步骤解析
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何在局域网内绑定自建网站域名?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
轻松掌握MySQL函数中的last_insert_id()
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何在Ubuntu系统下快速搭建WordPress个人网站?
晋江文学城电脑版官网 晋江文学城网页版直接进入
如何快速搭建个人网站并优化SEO?
独立制作一个网站多少钱,建立网站需要花多少钱?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
公司网站制作需要多少钱,找人做公司网站需要多少钱?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
手机软键盘弹出时影响布局的解决方法
如何快速搭建高效服务器建站系统?
高端建站三要素:定制模板、企业官网与响应式设计优化
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何确保FTP站点访问权限与数据传输安全?
微信小程序 scroll-view组件实现列表页实例代码
简历没回改:利用AI润色让你的文字更专业
如何在IIS中新建站点并解决端口绑定冲突?
Android利用动画实现背景逐渐变暗
如何用花生壳三步快速搭建专属网站?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
音乐网站服务器如何优化API响应速度?
详解Android图表 MPAndroidChart折线图
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
如何登录建站主机?访问步骤全解析
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Linux系统命令中screen命令详解
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
百度浏览器如何管理插件 百度浏览器插件管理方法

