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

ops/2025/1/24 5:30:59/

在这里插入图片描述

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

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

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

题目视图:

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

java">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 ,请你反转链表,并返回反转后的链表反转链表

题目视图

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

java">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 ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表的中间节点

题目视图:

在这里插入图片描述

题目讲解代码:

java">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个结点的值

题目视图:

在这里插入图片描述

题目详解代码:

java">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.将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

合并两个升序链表

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

题目详解代码:

java">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.ppmy.cn/ops/152660.html

相关文章

(4)ACS控制器Buffer程序记录与解析-PEG功能程序

一、pandas是什么&#xff1f; 示例&#xff1a;pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.程序 代码如下&#xff08;示例&#xff09;&#xff1a; ASSIGNPEG(0),4,0 ASSIGNPOUTS(0),0,0 ENABLE 0 ACC(0)10000 …

【浙江省乡镇界】面图层shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移内容测评

最新2020年乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移。arcgis直接打开&#xff0c;单独乡镇界一个图层。品质高

密码无关认证:金融机构如何解决密码问题

密码安全问题&#xff0c;依然是金融行业面临的重大挑战。尽管密码简单易用&#xff0c;但许多金融机构仍然依赖这种方式进行身份认证。幸运的是&#xff0c;随着技术的发展&#xff0c;密码无关认证已经成为一种更加安全、便捷的选择&#xff0c;它能够为数字银行带来更好的用…

root用户Linux银河麒麟服务器安装vnc服务

安装必要桌面环境组件 yum install mate-session-manager -y mate-session #确定是否安装成功安装vnc服务器 yum install tigervnc-server -y切换到root为root得vnc设置密码 su root vncpasswd给root用户设置vnc服务器文件 vi /etc/systemd/system/vncserver:1.service [Un…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

c++学习第七天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 一、const成员函数 //Date.h#pragma once#include<iostream> using namespace std;class Date { public:Date…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…

Elasticsearch 解决只能查询10000条数据方案

es官方默认限制索引查询最多只能查询10000条数据&#xff0c;查询第10001条数据开始就会报错&#xff0c;如下示例所示&#xff1a; 但是很多时候10000数据不能满足项目的需求&#xff0c;所以我们就要解除这个限制。解决办法主要有以下几种&#xff1a; 【方式一】&#xff0…