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

在这里插入图片描述

我的个人主页
我的专栏Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤
在这里插入图片描述
在这里插入图片描述

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

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

题目视图:

在这里插入图片描述
相关代码:

package Demo1_22;/*** Created with IntelliJ IDEA.* Description:* User:Lenovo* Date:2025-01-22* Time:20:56*/
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}class RemoveLinkedListElements {public ListNode removeElements(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;}public static void main(String[] args) {// 创建链表 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6ListNode node1 = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(6);ListNode node4 = new ListNode(3);ListNode node5 = new ListNode(4);ListNode node6 = new ListNode(5);ListNode node7 = new ListNode(6);node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;node5.next = node6;node6.next = node7;RemoveLinkedListElements solution = new RemoveLinkedListElements();// 调用 removeElements 方法,删除值为 6 的节点ListNode newHead = solution.removeElements(node1, 6);// 打印删除节点后的链表元素ListNode curr = newHead;while (curr!= null) {System.out.print(curr.val + " ");curr = curr.next;}}
}

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

题目视图

在这里插入图片描述
题目详解代码:

package Demo1_22;/*** Created with IntelliJ IDEA.* Description:* User:Lenovo* Date:2025-01-23* Time:18:24*/
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class ReverseLinkedList {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode current = head;while (current != null) {ListNode nextTemp = current.next;current.next = prev;prev = current;current = nextTemp;}return prev;}public static void main(String[] args) {// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);ListNode node5 = new ListNode(5);head.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;ReverseLinkedList solution = new ReverseLinkedList();ListNode reversedHead = solution.reverseList(head);while (reversedHead != null) {System.out.print(reversedHead.val + " ");reversedHead = reversedHead.next;}}
}

在这里插入图片描述

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

题目视图:

在这里插入图片描述

题目讲解代码:

package Demo1_22;/*** Created with IntelliJ IDEA.* Description:* User:Lenovo* Date:2025-01-23* Time:18:30*/
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class MiddleOfLinkedList {public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public static void main(String[] args) {// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);ListNode node5 = new ListNode(5);head.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;MiddleOfLinkedList solution = new MiddleOfLinkedList();ListNode middle = solution.middleNode(head);System.out.println(middle.val);}}

在这里插入图片描述

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

题目视图:

在这里插入图片描述

题目详解代码:

package Demo1_22;/*** Created with IntelliJ IDEA.* Description:* User:Lenovo* Date:2025-01-23* Time:18:33*/
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class FindKthFromEnd {public int findKthFromEnd(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;}public static void main(String[] args) {// 构建链表 1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);ListNode node5 = new ListNode(5);head.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;FindKthFromEnd solution = new FindKthFromEnd();int k = 2;int result = solution.findKthFromEnd(head, k);System.out.println("链表中倒数第 " + k + " 个节点的值是: " + result);}
}

在这里插入图片描述

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

合并两个升序链表

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

题目详解代码:

package Demo1_22;/*** Created with IntelliJ IDEA.* Description:* User:Lenovo* Date:2025-01-23* Time:18:36*/
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class MergeTwoSortedLists {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummy = new ListNode(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;}public static void main(String[] args) {// 构建链表1: 1 -> 2 -> 4ListNode list1 = new ListNode(1);list1.next = new ListNode(2);list1.next.next = new ListNode(4);// 构建链表2: 1 -> 3 -> 4ListNode list2 = new ListNode(1);list2.next = new ListNode(3);list2.next.next = new ListNode(4);MergeTwoSortedLists solution = new MergeTwoSortedLists();ListNode mergedList = solution.mergeTwoLists(list1, list2);while (mergedList != null) {System.out.print(mergedList.val + " ");mergedList = mergedList.next;}}
}

在这里插入图片描述
今天的链表题目就到这了,还有五到下篇见;
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【0x03】HCI_Connection_Complete事件详解

目录 一、事件概述 二、事件格式及参数详解 2.1. HCI_Connection_Complete事件格式 2.2. 事件参数 2.2.1. Status 2.2.2. Connection_Handle 2.2.3. BD_ADDR 2.2.4. Link_Type 2.2.5. Encryption_Enabled 三、事件处理流程 3.1. 事件触发 3.2. 事件接收与解析 3.…

激活版,快速安装

每天开机都要等待很长时间&#xff0c;玩游戏或看视频时频繁卡顿&#xff0c;甚至偶尔还会莫名其妙地崩溃。这种情况几乎每个人都遇到过&#xff0c;真是让人头疼不已。 别担心&#xff0c;其实有一种方法可以让你的电脑恢复如新&#xff0c;让我们一起看看如何解决这些烦恼吧…

二叉树(了解)c++

二叉树是一种特殊的树型结构&#xff0c;它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒&#xff0c;因此是一颗有序树 以A结点为例&#xff0c;左边的B是它的左孩子&#xff0c;右边的C是…

C#标准Mes接口框架(持续更新)

前言 由于近期我做了好几个客户的接入工厂Mes系统的需求。但是每个客户的Mes都有不同程度的定制需求&#xff0c;原有的代码复用难度其实很大。所以打算将整个接入Mes系统的框架单独拿出来作为一个项目使用&#xff0c;同时因为不同的设备接入同一个Mes系统&#xff0c;所以代…

【Nacos】负载均衡

目录 前言 一、服务下线二、权重配置三、同一个集群优先访问四、环境隔离 前言 我们的生产环境相对是比较恶劣的&#xff0c;我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略&#xff0c;包括配置权重&#xff0c;同机房&#xff0c;同地域&#xff0c;同环…

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

DDD该怎么去落地实现(1)关键是“关系”

DDD落地的关键是“关系” 这些年&#xff0c;我认为DDD走到了一个死胡同里了&#xff0c;因为落地实现过于困难。很多团队在经过一段时间的学习&#xff0c;清楚理解了DDD那些晦涩的概念&#xff0c;根据业务绘制出领域模型&#xff0c;这都不困难。但绘制领域模型不是我们最终…

RabbitMQ---面试题

常见面试题 1.MQ的作用及应用场景 类似问题&#xff1a;项目什么情况下用到了MQ&#xff0c;为什么要用MQ MQ的主要应用场景&#xff0c;消息队列的应用场景&#xff0c;为什么说消息队列可以削峰 首先MQ是一种用来接收和转发消息的队列&#xff0c;常见的应用常见如下&…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计&#xff0c;特别是针对内存池的设计&#xff0c;需要充分考虑多线程环境下&#xff1a; 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率&#xff0c;减少锁竞争和内存碎片。 高并发内存…

WebODM之python实现

1、安装webodm_slam 主要是了解API文档,查看之前的文章 安装WebODM_slate 2、安装webodm 查看之前的文章 Win10安装WebODM和操作全流程 3、python脚本 项目案例 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of…

2025年美赛C题:奥运奖牌榜模型 解析及Python代码实现

2025年美赛C题&#xff1a;奥运奖牌榜模型 解析及Python代码实现 1 题目 2025 MCM问题C&#xff1a;奥运奖 牌榜模型在最近的2024年巴黎夏季奥运会期间&#xff0c; 粉丝们除了观看个人项目外&#xff0c; 还关注每个 国家的整体 “ 奖牌榜 ”。 最终的结果&#xff08;表1&am…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代&#xff0c;构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架&#xff0c;以其快速开发、简洁配置和丰富的生态支持&#xff0c;深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…

快门:凝固瞬间与塑造动感的魔法开关

目录 一、快门的基本概念 二、快门速度的分类及效果 &#xff08;一&#xff09;高速快门 &#xff08;二&#xff09;低速快门 &#xff08;三&#xff09;安全快门 三、快门优先模式&#xff1a;掌控拍摄节奏的利器 四、快门与其他摄影要素的关系 &#xff08;一&…

2025发文新方向:AI+量化 人工智能与金融完美融合!

2025深度学习发论文&模型涨点之——AI量化 人工智能的融入&#xff0c;使量化交易实现了质的突破。借助机器学习、深度学习等先进技术&#xff0c;人工智能可高效处理并剖析海量市场数据&#xff0c;挖掘出数据背后错综复杂的模式与趋势&#xff0c;从而不仅提升了数据分析…

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

golang网络编程

socket编程 socket图解 Socket是BSD UNIX的进程通信机制&#xff0c;通常也称作”套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。Socket可以理解为TCP/IP网络的API&#xff0c;它定义了许多函数或例程&#xff0c;程序员可以用它们来开发TCP/IP网…