【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝

【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝
在这里插入图片描述

我的个人主页
我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤

在这里插入图片描述


在这里插入图片描述
引言:
Java链表,看似简单的链式结构,却蕴含着诸多有趣的特性与奥秘,等待我们去挖掘。它就像一个神秘的宝藏迷宫,每一个特性都是隐藏在迷宫深处的珍贵宝藏。链表的环,如同迷宫中的循环通道,一旦进入,便可能陷入无尽的循环;链表节点的唯一性与重复性,仿佛迷宫中的岔路,有的道路独一无二,有的却似曾相识;而链表的长度变化,又如同迷宫的动态扩展与收缩。在接下来的题目中,你将化身为勇敢的探险家,深入链表特性的迷宫,运用你的编程智慧,解开一个个谜题。通过检测链表的环、分析节点的重复性以及精准计算链表长度,你将逐渐揭开链表神秘的面纱,领略数据结构背后的奇妙逻辑。

1. 删除链表中等于给定值 val 的所有节点。移除链表元素

题目视图:
在这里插入图片描述


相关代码:

packageDemo1_22;/** * Created with IntelliJ IDEA. * Description: * User:Lenovo * Date:2025-01-22 * Time:20:56 */classListNode{int val;ListNode next;ListNode(int val){this.val = val;}}classRemoveLinkedListElements{publicListNoderemoveElements(ListNode head,int val){// 处理头节点为 null 的情况while(head!=null&& head.val == val){ head = head.next;}ListNode curr = head;// 遍历链表while(curr!=null&& curr.next!=null){if(curr.next.val == val){ curr.next = curr.next.next;}else{ curr = curr.next;}}return head;}publicstaticvoidmain(String[] args){// 创建链表 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6ListNode node1 =newListNode(1);ListNode node2 =newListNode(2);ListNode node3 =newListNode(6);ListNode node4 =newListNode(3);ListNode node5 =newListNode(4);ListNode node6 =newListNode(5);ListNode node7 =newListNode(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node7;RemoveLinkedListElements solution =newRemoveLinkedListElements();// 调用 removeElements 方法,删除值为 6 的节点ListNode newHead = solution.removeElements(node1,6);// 打印删除节点后的链表元素ListNode curr = newHead;while(curr!=null){System.out.print(curr.val +" "); curr = curr.next;}}}

2.给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。反转链表

题目视图
在这里插入图片描述


题目详解代码:

packageDemo1_22;/** * Created with IntelliJ IDEA. * Description: * User:Lenovo * Date:2025-01-23 * Time:18:24 */classListNode{int val;ListNode next;ListNode(int val){this.val = val;}}publicclassReverseLinkedList{publicListNodereverseList(ListNode head){ListNode prev =null;ListNode current = head;while(current !=null){ListNode nextTemp = current.next; current.next = prev; prev = current; current = nextTemp;}return prev;}publicstaticvoidmain(String[] args){// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head =newListNode(1);ListNode node2 =newListNode(2);ListNode node3 =newListNode(3);ListNode node4 =newListNode(4);ListNode node5 =newListNode(5); head.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;ReverseLinkedList solution =newReverseLinkedList();ListNode reversedHead = solution.reverseList(head);while(reversedHead !=null){System.out.print(reversedHead.val +" "); reversedHead = reversedHead.next;}}}
在这里插入图片描述

3.给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表的中间节点

题目视图:
在这里插入图片描述

题目讲解代码:

packageDemo1_22;/** * Created with IntelliJ IDEA. * Description: * User:Lenovo * Date:2025-01-23 * Time:18:30 */classListNode{int val;ListNode next;ListNode(int val){this.val = val;}}publicclassMiddleOfLinkedList{publicListNodemiddleNode(ListNode head){ListNode slow = head;ListNode fast = head;while(fast !=null&& fast.next !=null){ slow = slow.next; fast = fast.next.next;}return slow;}publicstaticvoidmain(String[] args){// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head =newListNode(1);ListNode node2 =newListNode(2);ListNode node3 =newListNode(3);ListNode node4 =newListNode(4);ListNode node5 =newListNode(5); head.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;MiddleOfLinkedList solution =newMiddleOfLinkedList();ListNode middle = solution.middleNode(head);System.out.println(middle.val);}}
在这里插入图片描述

4.实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。返回倒数第k个结点的值

题目视图:

题目详解代码:

packageDemo1_22;/** * Created with IntelliJ IDEA. * Description: * User:Lenovo * Date:2025-01-23 * Time:18:33 */classListNode{int val;ListNode next;ListNode(int val){this.val = val;}}publicclassFindKthFromEnd{publicintfindKthFromEnd(ListNode head,int k){ListNode slow = head;ListNode fast = head;// 先让fast指针前进k步for(int i =0; i < k; i++){if(fast ==null){return-1;// 链表长度小于k,可根据实际情况调整返回值} fast = fast.next;}// 然后slow和fast同时前进,直到fast到达链表末尾while(fast !=null){ slow = slow.next; fast = fast.next;}return slow.val;}publicstaticvoidmain(String[] args){// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head =newListNode(1);ListNode node2 =newListNode(2);ListNode node3 =newListNode(3);ListNode node4 =newListNode(4);ListNode node5 =newListNode(5); head.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;FindKthFromEnd solution =newFindKthFromEnd();int k =2;int result = solution.findKthFromEnd(head, k);System.out.println("链表中倒数第 "+ k +" 个节点的值是: "+ result);}}
在这里插入图片描述

5.将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

合并两个升序链表

题目视图:

题目详解代码:

packageDemo1_22;/** * Created with IntelliJ IDEA. * Description: * User:Lenovo * Date:2025-01-23 * Time:18:36 */classListNode{int val;ListNode next;ListNode(int val){this.val = val;}}publicclassMergeTwoSortedLists{publicListNodemergeTwoLists(ListNode list1,ListNode list2){ListNode dummy =newListNode(0);ListNode current = dummy;while(list1 !=null&& list2 !=null){if(list1.val < list2.val){ current.next = list1; list1 = list1.next;}else{ current.next = list2; list2 = list2.next;} current = current.next;}if(list1 !=null){ current.next = list1;}if(list2 !=null){ current.next = list2;}return dummy.next;}publicstaticvoidmain(String[] args){// 构建链表1: 1 -> 2 -> 4ListNode list1 =newListNode(1); list1.next =newListNode(2); list1.next.next =newListNode(4);// 构建链表2: 1 -> 3 -> 4ListNode list2 =newListNode(1); list2.next =newListNode(3); list2.next.next =newListNode(4);MergeTwoSortedLists solution =newMergeTwoSortedLists();ListNode mergedList = solution.mergeTwoLists(list1, list2);while(mergedList !=null){System.out.print(mergedList.val +" "); mergedList = mergedList.next;}}}
在这里插入图片描述


今天的链表题目就到这了,还有五到下篇见;

在这里插入图片描述

Read more

Spring Boot 安全认证与授权

Spring Boot 安全认证与授权

Spring Boot 安全认证与授权 22.1 学习目标与重点提示 学习目标:掌握Spring Boot安全认证与授权的核心概念与使用方法,包括Spring Security的定义与特点、Spring Boot与Spring Security的集成、Spring Boot与Spring Security的配置、Spring Boot与Spring Security的认证、Spring Boot与Spring Security的授权、Spring Boot与Spring Security的实际应用场景,学会在实际开发中处理安全认证与授权问题。 重点:Spring Security的定义与特点、Spring Boot与Spring Security的集成、Spring Boot与Spring Security的配置、Spring Boot与Spring Security的认证、Spring Boot与Spring Security的授权、Spring Boot与Spring Security的实际应用场景。 22.2 Spring Security概述 Spring

By Ne0inhk
Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互无缝穿透 随着 Web3 技术与移动端的深度融合,支持区块链交互的应用日益增多。ethereum 库专注于以太坊(Ethereum)协议的底层通讯,为开发者提供了便捷的 Web3 集成方案。本文将详细介绍该库在 OpenHarmony 上的适配要点与实战指南。 前言 以太坊是目前最活跃的智能合约平台。在鸿蒙操作系统这个创新的万物智联生态中,支持以太坊交互可以为鸿蒙应用带来去中心化身份(DID)、数字资产(NFT)以及去中心化金融(DeFi)等前沿能力。本文将带你实现在鸿蒙端极速调起智能合约并查询链上数据。 一、原理解析 1.1 基础概念 ethereum 库封装了标准的以太坊 JSON-RPC 协议。在鸿蒙端,它利用 HTTP 请求与以太坊节点(

By Ne0inhk
EnvPilot:一款基于 Rust 的跨平台环境变量神器,一键搞定 Windows/Linux 环境配置!

EnvPilot:一款基于 Rust 的跨平台环境变量神器,一键搞定 Windows/Linux 环境配置!

文章目录 * 1. 项目介绍🎯 * 1.1. 什么是 EnvPilot? * 1.2. 为什么选择 EnvPilot? * 2. 核心优势:四大痛点全部解决!💪 * ✅ 痛点一:添加不生效?已修复! * ✅ 痛点二:删除删不掉?已修复! * ✅ 痛点三:PATH 清理失效?已修复! * ✅ 痛点四:误操作无法恢复?已解决! * 3. 支持的开发环境🛠️ * 4. 详细使用教程📖 * 4.1. Windows 平台使用教程 * 1️⃣ 下载安装 * 2️⃣ 配置环境变量 * 3️⃣ 清除环境变量 * 4.2. Linux 平台使用教程 * 1️⃣ 从源码编译 * 2️⃣ 配置环境变量 * 3️

By Ne0inhk
基于 Rust 与 DeepSeek 大模型的智能 API Mock 生成器构建实录:从环境搭建到架构解析

基于 Rust 与 DeepSeek 大模型的智能 API Mock 生成器构建实录:从环境搭建到架构解析

前言 在现代软件工程中,API 接口的开发与前端联调往往存在时间差。为了解耦前后端开发进度,Mock 数据(模拟数据)的生成显得尤为关键。传统的 Mock 数据生成依赖于静态 JSON 文件或简单的规则引擎,难以覆盖复杂的业务逻辑与语义关联。随着大语言模型(LLM)的兴起,利用 AI 根据 Schema 定义动态生成高保真的模拟数据成为可能。本文详细记录了使用 Rust 语言结合 DeepSeek-V3.2 模型构建智能 Mock 生成器的完整技术路径,涵盖操作系统层面的环境准备、Rust 工具链的深度配置、代码层面的异步架构设计以及编译期的版本兼容性处理。 第一部分:Linux 系统底层的构建环境初始化 Rust 语言的编译与链接过程高度依赖于底层的系统工具链。Rust 编译器 rustc 在生成二进制文件时,需要调用链接器(Linker)将编译后的对象文件(Object Files)与系统库(

By Ne0inhk