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

news2024/11/28 18:58:00

遇到过一道奇奇怪怪的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 -> 5
        ListNode 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.coloradmin.cn/o/1145921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 吴恩达课程笔记——深度学习概论、神经网络基础 一、概念区别1.深度学习与机器学习2.深度学习与神经网络 二、什么是神经网络1.分类2.特点3.工作原理4.神经网络示意图5.神经网络进行监督学习6.深度学习的发展 三、…

mathtype怎么更改编号 mathtype章节编号错乱怎么办

mathtype作为一款功能强大的公式编辑器&#xff0c;使用范围广泛&#xff0c;与多款软件兼容。但新手可能会对mathtype的操作不熟悉&#xff0c;不知道如何在mathtype中更改编号&#xff0c;以及解决章节编号错乱问题。本文将围绕mathtype怎么更改编号&#xff0c;mathtype章节…

Ansible 安装部署及常用命令和17个模块详解

目录 Ansible 1 ansible 环境安装部署 1.1 管理端安装 ansible 1.2 ansible 目录结构 1.3 配置主机清单 1.4 配置密钥对验证 2 ansible 命令行模块 2.1 command 模块 2.2 shell 模块 2.3 cron 模块 2.4 user 模块 2.5 group 模块 2.6 copy 模块 2.7 file 模块 2.…

磁盘的结构(磁道,扇区,盘面,柱面,物理地址)

目录 1.磁盘、磁道、扇区的概念1.磁盘2.磁道3.扇区 2.如何在磁盘中读/写数据3.盘面、柱面的概念4.磁盘的物理地址1.根据地址读取一个“块” 5.磁盘的分类1.活动头磁道2.固定头磁盘3.根据盘片是否可更换 1.磁盘、磁道、扇区的概念 1.磁盘 磁盘的表面由一些磁性物质组成&#xf…

VS Code打开新的文件夹,会覆盖原来的文件夹。如何保持原来的文件夹并新打开一个窗口

默认打开新文件夹时&#xff0c;会覆盖掉当前的窗口&#xff0c;导致每次只能看一个项目文件夹。想让其打开新文件夹时&#xff0c;以新窗口打开&#xff0c;不覆盖当前窗口&#xff0c;可以进行如下设置。 然后重启VS Code就可以生效了&#xff01;可以同时打开多个文件夹。效…

CSS宽度100%和宽度100vw之间有什么不同?

vw和vh分别代表视口宽度和视口高度。 使用width: 100vw代替的区别在于width: 100%&#xff0c;虽然100%将使元素适合所有可用空间&#xff0c;但视口宽度具有特定的度量&#xff0c;在这种情况下&#xff0c;可用屏幕的宽度 。 如果设置样式body { margin: 0 }&#xff0c;则1…

网络原理之IP协议

文章目录 前言IP 协议的协议头格式地址管理1. 动态分配 IP2. NAT机制&#xff08;网络地址转换&#xff09;NAT 机制是如何工作的 3. IPv6 网段划分子网掩码路由选择 前言 前面我们学习了关于 UDP 协议和 TCP 协议方面的内容&#xff0c;这些都是网络传输中传输层方面的协议&a…

WebGIS瓦片地图添加水印(矢量瓦片、栅格瓦片)

水印技术 水印能为收到版权信息产品归属提供有力的证据, 并能够监视被保护数据的传播, 真伪鉴别以及非法拷贝控制等.在现今流行的线上地图同样需要水印技术, 保护地图数据.本文将介绍如何实现瓦片地图水印添加, 包括栅格瓦片、矢量瓦片. 在探索过程中, 参考了《前端水印生成方案…

NTRU 加密方案

参考文献&#xff1a; [Rivest97] Rivest R L. All-or-nothing encryption and the package transform[C]//Fast Software Encryption: 4th International Workshop, FSE’97 Haifa, Israel, January 20–22 1997 Proceedings 4. Springer Berlin Heidelberg, 1997: 210-218.[…

云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)

0x00 云原生技术-docker docker容器和虚拟机的对比&#xff1a;前者是将运行环境打包&#xff0c;封装一个环境。后者是将整个系统打包&#xff0c;封装一个系统。在操作使用上来说各有利弊。 0x01 docker容器的三种逃逸类型 特权模式启动&#xff08;不安全的启动方式&…

Qt5.15:MinGW64位编译Oracle 19c数据库驱动及代码测试 - 安装时没有选Sources处理办法

文章目录 0 代码仓库1 环境以及条件说明2 准备一&#xff1a;下载Oracle 19c驱动&#xff0c;需要下载两个包&#xff0c;注意分x86和x642.1 32位2.2 64位2.3 新建目录并解压缩2.4 记录路径2.4.1 x86需要的路径2.4.2 x64需要的路径 3 准备二&#xff1a;下载Sources源代码的两种…

毅速丨金属3D打印能替代传统制造吗?

金属3D打印技术已经逐渐被很多行业认可和应用&#xff0c;但是目前&#xff0c;金属3D打印多数被作为传统制造技术的一种补充&#xff0c;暂时还不能完全替代传统制造。 金属3D打印使用的是金属粉末进行选择性激光烧结&#xff0c;打印时在成型缸里铺上金属粉末&#xff0c;打印…

【刷题宝典NO.1】

Nim游戏 https://leetcode.cn/problems/nim-game/description/ 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…

替换所有的问号

这篇也是凑数的 哈哈.... 稍后会整合到算法通关第三关白银挑战 . 描述 : 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意 : 不能 修改非 ? 字符 . 题目 : …

分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双…

【计算机视觉】3D视觉

文章目录 一、基本问题二、三个坐标系 X w \boldsymbol{X}_w Xw​到 X c \boldsymbol{X}_c Xc​的转换 X c \boldsymbol{X}_c Xc​到 x i \boldsymbol{x}_i xi​的转换投影矩阵尺度模糊问题 三、相机标定四、立体视觉 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#x…

JDK21下载和安装

说明 本文介绍 JDK21&#xff08;Oracle版&#xff09;的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型&#xff0c;下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包&#xff0c;开始安装。 把路径改为自定…

【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作4.2.4十字链表0. 十字链表结构1. 创建2. 销毁3. 插入4. 打印矩阵形式5. 按行打印6.按列打…

京东平台数据分析(京东销量):2023年9月京东吸尘器行业品牌销售排行榜

鲸参谋监测的京东平台9月份吸尘器市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东吸尘器的销量为19万&#xff0c;环比下滑约12%&#xff0c;同比下滑约25%&#xff1b;销售额为1.2亿&#xff0c;环比下滑约11%&…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …