【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构

【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
在这里插入图片描述


文章目录

一、移除链表元素

题目链接:https://leetcode.cn/problems/remove-linked-list-elements/

我们先来看看题目描述和第一个示例:

在这里插入图片描述


根据题目描述我们就可以大致明白题意,就是将一个链表中的某个值的节点删除,然后返回新链表的头结点,然后题目要我们实现的函数给了我们头结点,以及要删除的数据,我们要把相应的节点删除

思路一

首先最简单的思路就是,我们可以通过之前实现的链表的方法用上,首先使用Find方法找到对应的值,然后使用Erase方法删除,直到Find方法返回空指针结束
由于这个方法思路比较好实现,这里就不再赘述了,可以自己尝试一下,我们的关键是更优方法的思路二

思路二

这个题其实跟我们在刷顺序表题的时候遇见类似的,只不过之前要删除的是数组中的元素,这道题是删除链表节点,不过本质上是相同的,上次我们使用了双指针,这次我们还是可以使用双指针,顺序表刷题参考:【初阶数据结构与算法】沉浸式刷题之顺序表练习(顺序表以及双指针两种方法)
具体思路也很像之前的那个题,题目让返回新链表的头结点,没有说必须是原链表的头结点,所以我们可以新建一个链表,如果遍历到原链表中节点的值不是题目给定的值,也就是不是我们要删除的节点,那么我们就把它尾插到新链表
我们要注意的是,如果遇到了要插入的节点,但是新链表的头为空,我们就要让新链表的头和尾都指向这个节点,其它情况就正常尾插
还有一个重要的地方就是,当我们把链表移动完毕之后,新链表的尾结点可能还指向原链表的节点,我们要把它置为空,题解如下:

typedefstructListNode ListNode;structListNode*removeElements(structListNode* head,int val){  ListNode* newhead,*newtail; newhead = newtail =NULL; ListNode* pcur = head;while(pcur){ if(pcur->val != val){ if(newhead ==NULL){  newhead = newtail = pcur;}else{  newtail->next = pcur; newtail = pcur;}} pcur = pcur->next;}if(newtail) newtail->next =NULL;return newhead;}
在这里插入图片描述

二、合并两个有序链表

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/

我们先来看看题目的描述和第一个示例:

在这里插入图片描述


题目给我们两个有序链表,要求我们把这两个链表合并成一个新的有序链表,然后返回它的头结点

思路:

这个问题是不是有点似曾相识,跟我们之前的合并有序数组是一样的,我们当时的方法就是使用双指针,只是合并有序数组时是要求我们在第一个数组中进行修改,不能新建一个数组返回
但是这道题还要简单一些,它可以新建一个链表,我们可以通过双指针遍历要合并的链表,比较两个链表中节点的大小,谁小谁就尾插到新链表,直到有一个链表走到空就停止循环
但是我们要注意的一点是,虽然有一个链表走到空了,也就是一个链表中的节点都插入到新链表了,但是另一个链表可能还有节点,所以我们要判断一下,如果两个链表中还有一个链表不为空,那么直接将它的所有节点尾插到新链表
还有就是做一个特殊处理,因为两个链表中可能有空链表,上面的方法就跑不通,所以我们判断一下,如果有一个链表为空,那么直接返回另一个链表,题解如下:

typedefstructListNode ListNode;structListNode*mergeTwoLists(structListNode* list1,structListNode* list2){ if(list1 ==NULL){ return list2;}if(list2 ==NULL){ return list1;} ListNode* pcur1,*pcur2; ListNode* newhead,*newtail; pcur1 = list1; pcur2 = list2; newhead = newtail =NULL;while(pcur1 && pcur2){ 

Read more

飞算JavaAI赋能企业级电商管理系统开发实践——一位资深开发者的技术选型与落地总结

飞算JavaAI赋能企业级电商管理系统开发实践——一位资深开发者的技术选型与落地总结

目录 * 一、背景与选型考量 * 二、开发环境与工具适配 * 1. 基础环境搭建 * 2. 飞算JavaAI插件配置 * 3. 版本控制与协作配置 * 三、核心模块设计与实现 * 1. 需求分析与模块拆分 * 2. 核心代码实现与技术亮点 * (1)实体类设计(带审计字段与枚举约束) * (2)服务层实现(带事务控制与业务校验) * (3)控制器实现(带权限控制与参数校验) * (4)网页端 * 四、系统架构与扩展性设计 * 1. 分层架构设计 * 2. 接口设计规范 * 3. 扩展性保障 * 五、资深开发者视角的工具评价 * 1. 代码规范性与可维护性 * 2. 对企业级业务的理解深度 * 3. 与资深开发者工作流的适配性 * 六、项目成果与经验总结 一、背景与选型考量 作为一名从业20余年的开发者,我亲历了从JSP+

By Ne0inhk
Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践

Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践

Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践 前言:截至 2026 年 2 月,Spring Boot 3.x 已成为企业级 Java 开发的事实标准。根据最新调研,阿里、字节、腾讯等头部大厂已 100% 完成 Spring Boot 3.2.x 的迁移,3.5.x 作为 3.x 系列的最后一个重大版本,将维护至 2026 年 6 月。然而,从 Spring Boot 2.

By Ne0inhk
Java 反射机制

Java 反射机制

【深度解析】Java 反射机制:从底层原理到实战应用(附性能优化) 反射是 Java 语言的 “黑魔法”,也是所有主流框架(Spring、MyBatis、Hibernate)的底层核心能力。它打破了 “编译期确定逻辑” 的限制,让程序能在运行时动态操作类、对象、方法和注解,是中高级 Java 开发者必须吃透的核心知识点。 本文将从底层原理、核心 API 实战、业务落地场景、性能优化四个维度,结合枚举释义工具类的真实案例,把反射讲透、讲实,不仅让你理解 “是什么”,更能掌握 “怎么用”“怎么优化”。 一、反射是什么?核心价值是什么? 1.1 反射的定义 反射(Reflection)是 Java 提供的一套运行时编程机制,允许程序: * 探知:

By Ne0inhk
Java 大视界 -- Java 大数据在智能物流仓储货位优化与库存周转率提升中的应用实战

Java 大视界 -- Java 大数据在智能物流仓储货位优化与库存周转率提升中的应用实战

Java 大视界 -- Java 大数据在智能物流仓储货位优化与库存周转率提升中的应用实战 * 引言: * 正文: * 一、传统智能物流仓储的困境与挑战 * 1.1 货位管理:无序中的效率瓶颈 * 1.2 库存管理:积压与缺货并存的矛盾 * 二、Java 大数据:智能物流仓储的破局之道 * 2.1 全链路数据采集与处理:构建仓储数字孪生体 * 2.2 智能货位优化:算法驱动的空间革命 * 2.3 库存周转率提升:精准预测与智能协同 * 三、实战案例:京东亚洲一号智能仓的数字化转型 * 3.1 货位优化实践 * 3.2 库存管理创新 * 四、技术挑战与未来展望 * 结束语: * 🗳️参与投票和联系我: 引言: 嘿,亲爱的 Java

By Ne0inhk