Java题:查找单链表中第 k 个节点元素的值

news/2024/11/29 12:36:56/

遇到过一道奇奇怪怪的Java题,就整理出自己的想法,不知道对不对,还望大佬们指导。

题目

给定一个单链表,查找单链表中第 k 个节点元素的值,同时要求使用时间复杂度低的算法实现。

单链表的定义如下:

class ListNode {int val;ListNode next;ListNode(int val){this.val=val;}}

我的想法

这题很迷惑,我的两种思考方向是:

  1. Java书上说的是:遍历链表,使用迭代器要比get()快
    在这里插入图片描述

  2. 单纯考虑时间复杂度都是O(n)。但是快慢指针(跳表) 会不会更好一点呢?我不确定

总之就是非常迷惑。

我的代码

快慢指针、指针、迭代器 三种写法

import java.util.Iterator;class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}public class List {//	快慢指针public static int findKthNode(ListNode head, int k) {ListNode fast = head;for (int i = 0; i < k - 1; i++) {fast = fast.next;if (fast == null) {return -1; // 返回 -1 表示 链表长度小于k}}ListNode slow = head;while (fast.next != null) {fast = fast.next;slow = slow.next;}return slow.val;}//	指针public static int findKthNode1(ListNode head, int k) {ListNode current = head;int count = 1; // 记录迭代的次数,从1开始while (current != null && count < k) {current = current.next;count++;}if (current == null) {return -1; // 返回 -1 表示 链表长度小于k}return current.val;}//	迭代器public static int findKthNode2(ListNode head, int k) {Iterator<ListNode> iterator = new Iterator<ListNode>(){ListNode current = head;public boolean hasNext() {return current != null;}public ListNode next() {ListNode node = current;current = current.next;return node;}public void remove() {throw new UnsupportedOperationException("Unsupported operation: remove");}};ListNode target = null;int count = 0;while (iterator.hasNext()) {ListNode node = iterator.next();count++;if (count == k) {target = node;break;}}if (target == null) {return -1; // 返回 -1 表示 链表长度小于k}return target.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;// 创建一个实例对象Main main = new Main();// 测试查找第 k 个节点元素的值int k = 3;int result1 = findKthNode(head, k); // 快慢指针int result2 = findKthNode1(head, k); // 指针int result3 = findKthNode2(head, k); // 迭代器System.out.println("快慢指针实现 :第 " + k + " 个节点的值为:" + result1);System.out.println("指针实现 :第 " + k + " 个节点的值为:" + result1);System.out.println("迭代器实现 :第 " + k + " 个节点的值为:" + result1);}
}

输出

快慢指针实现 :第 3 个节点的值为:3
指针实现 :第 3 个节点的值为:3
迭代器实现 :第 3 个节点的值为:3

还是不太懂题目的真正含义,还望大佬指点


http://www.ppmy.cn/news/1183572.html

相关文章

PHP简单实现预定义钩子和自定义钩子

在PHP中&#xff0c;钩子&#xff08;Hooks&#xff09;是一种机制&#xff0c;允许开发人员在特定的时机插入自定义代码。通过使用钩子&#xff0c;开发人员可以在应用程序的特定事件发生时执行自定义的功能或逻辑 钩子有两种类型&#xff1a;预定义钩子和自定义钩子。 预定…

OSPF,RIP和BGP的路由汇总

OSPF路由汇总 OSPF的路由汇总需要注意以下两点 1.OSPF的路由汇总仅支持手动汇总 注&#xff1a;距离矢量路由协议支持自动路由汇总&#xff0c;链路状态路由协议仅支持手动路由汇总&#xff08;OSPF,ISIS&#xff09; 2.OSPF的路由汇总只在区域边界进行汇总 OSPF的路由汇总…

nodejs+vue全国公考岗位及报考人数分析

传统的搜索引擎尽管解决了信息搜索问题&#xff0c;但无法进行有效的数据分析和优质资源的获取。并且&#xff0c;人们的需求不同&#xff0c;数据的要求也不同。为了解决这一问题&#xff0c;定向抓取数据的爬虫诞生了。它的诞生把人们从重复性的劳动中解放出来&#xff0c;节…

路由器和交换机之间的区别

1.工作层不同 路由器工作在网络层&#xff0c;根据IP地址寻址&#xff0c;处理TCP/IP协议 交换机工作在中继层&#xff0c;根据MAC地址寻址&#xff0c;无法处理TCP/IP协议 2.转发对象不同 路由器转发的对象是IP地址&#xff08;网络地址&#xff09;&#xff0c;负责让主机连接…

实战经验分享FastAPI 是什么

FastAPI 是什么&#xff1f;FastAPI实战经验分享 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7e9e23e6fe3444238413d91f37064b65.png](https://fastapi.tiangolo.com/) FastAPI 是一个先进、高效的 Python Web 框架&#xff0c;专门用于构建基于 Python 的 API。它是…

SpringCloud 微服务全栈体系(六)

第八章 Gateway 服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管…

Redis学习笔记5:基于springboot的lettuce redis客户端断线重连ConnectionWatchdog

lettuce默认采用共享本地连接的模式和redis服务器端交互&#xff0c;如果连接断开如何及时发现并且重新建立连接呢&#xff1f;通过翻阅源码发现有两种方案&#xff0c;方案一&#xff1a;开启连接有效性检测&#xff1b;方案二&#xff1a;通过ConnectionWatchdog监视器 一个对…

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】