华为OD机试 - 单向链表中间节点(Java JS Python C C++)

题目描述

给定一个单链表 L,请编写程序输出 L 中间结点保存的数据。

如果有两个中间结点,则输出第二个中间结点保存的数据。例如:

给定 L 为 1→7→5,则输出应该为7;
给定 L 为 1→2→3→4,则输出应该为3;
输入描述
每个输入包含1个测试用例。

每个测试用例:

第一行给出链表首结点的地址、结点总个数正整数 N (≤ 10^5)。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式位:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据(0 ≤ Data ≤ 10^8),Next是下一结点的地址。

输出描述

对每个测试用例,在一行中输出 L 中间结点保存的数据。 如果有两个中间结点,则输出第二个中间结点保存的数据。

用例1
输入
00010 4
00000 3 -1
00010 5 12309
11451 6 00000
12309 7 11451
输出
6
用例2
输入
10000 3
76892 7 12309
12309 5 -1
10000 1 76892
输出
7

解析

为了解决这个问题,我们可以使用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针将位于链表的中间。如果链表长度是奇数,则慢指针指向的就是中间节点;如果链表长度是偶数,则慢指针指向的是中间两个节点中的第一个,但因为我们要求输出第二个中间节点,所以在这种情况下我们还需要额外处理一次。

以下是具体的算法步骤:

初始化两个指针,slow 和 fast,都指向链表的头结点。
进入循环,在循环中,fast 每次移动两步,slow 每次移动一步。如果 fast 或 fast->next 为 NULL,则跳出循环。
如果链表长度是偶数,且 fast 为 NULL,那么 slow 指向的是中间两个节点中的第一个,我们需要将 slow 移动到下一个节点。
输出 slow 指向的节点的数据。
现在,我们根据上述步骤来实现具体的代码。注意,因为输入是通过文本格式给出的,我们首先需要解析输入以构建链表,然后再执行上述算法。

以下是一个可能的C++实现:

#include <iostream>  
#include <unordered_map>  
using namespace std;  struct ListNode {  int address;  int data;  int next;  ListNode(int a, int d, int n) : address(a), data(d), next(n) {}  
};  unordered_map<int, ListNode*> addressToNode;  int main() {  int headAddress, N;  cin >> headAddress >> N;  // 读取链表信息并构建链表  for (int i = 0; i < N; ++i) {  int a, d, n;  cin >> a >> d >> n;  addressToNode[a] = new ListNode(a, d, n);  }  ListNode* head = addressToNode[headAddress];  ListNode* slow = head;  ListNode* fast = head;  // 快慢指针寻找中间节点  while (fast != nullptr && fast->next != nullptr) {  slow = slow->next;  fast = fast->next->next;  }  // 如果链表长度是偶数,且fast为NULL,则slow指向的是中间两个节点中的第一个  // 因此我们需要将slow移动到下一个节点  if (fast == nullptr) {  slow = slow->next;  }  // 输出中间节点的数据  cout << slow->data << endl;  // 释放链表内存  for (auto& pair : addressToNode) {  delete pair.second;  }  return 0;  
}

注意:上述代码假设输入的链表数据是合法的,没有进行错误处理。在实际应用中,你可能需要添加额外的错误处理代码来确保程序的健壮性。此外,这段代码使用了C++的STL库中的unordered_map来方便地通过地址查找节点。

代码

为了解决这个问题,我们需要先定义链表节点的数据结构,然后编写程序来构建链表,并找到中间节点。由于每个语言的实现细节略有不同,我将分别为Java、JavaScript、Python、C和C++提供解决方案。

Java
Java中没有直接支持链表的地址操作,但我们可以模拟这个过程,使用整数作为地址,并构建链表。

java

import java.util.*;  class ListNode {  int address;  int data;  int next;  ListNode(int address, int data, int next) {  this.address = address;  this.data = data;  this.next = next;  }  
}  public class Main {  public static void main(String[] args) {  Scanner scanner = new Scanner(System.in);  // 读取首节点地址和节点总数  int headAddress = scanner.nextInt();  int n = scanner.nextInt();  Map<Integer, ListNode> nodeMap = new HashMap<>();  // 读取节点信息  for (int i = 0; i < n; i++) {  int address = scanner.nextInt();  int data = scanner.nextInt();  int next = scanner.nextInt();  ListNode node = new ListNode(address, data, next);  nodeMap.put(address, node);  }  // 构建链表  ListNode head = nodeMap.get(headAddress);  ListNode slow = head, fast = head;  while (fast != null && fast.next != null) {  slow = slow.next;  fast = fast.next.next;  }  // 输出中间节点的数据  System.out.println(slow.data);  scanner.close();  }  
}

JavaScript
在JavaScript中,我们可以使用对象来模拟链表节点,并构建链表。

javascript

const readline = require('readline');  
const rl = readline.createInterface({  input: process.stdin,  output: process.stdout  
});  class ListNode {  constructor(address, data, next) {  this.address = address;  this.data = data;  this.next = next;  }  
}  rl.on('line', (line) => {  const [headAddress, n] = line.split(' ').map(Number);  const nodeMap = {};  for (let i = 0; i < n; i++) {  const [address, data, next] = rl.readLine().sync().split(' ').map(Number);  nodeMap[address] = new ListNode(address, data, next);  }  let head = nodeMap[headAddress];  let slow = head, fast = head;  while (fast && fast.next) {  slow = slow.next;  fast = fast.next.next;  }  console.log(slow.data);  rl.close();  
});

Python
在Python中,我们可以使用字典来模拟链表节点的地址映射,并构建链表。

python

class ListNode:  def __init__(self, address, data, next):  self.address = address  self.data = data  self.next = next  def find_middle_node(head):  slow = fast = head  while fast and fast.next:  slow = slow.next  fast = fast.next.next  return slow.data  if __name__ == "__main__":  n, head_address = map(int, input().split())  nodes = {}  for _ in range(n):  address, data, next_address = map(int, input().split())  nodes[address] = ListNode(address, data, next_address)  head = nodes[head_address]  middle_data = find_middle_node(head)  print(middle_data)

C
在C语言中,我们可以使用结构体来表示链表节点,并使用数组来模拟地址映射。

c

#include <stdio.h>  
#include <stdlib.h>  #define MAX_NODES 100000  typedef struct ListNode {  int address;  int data;  int next;  
} ListNode;  ListNode nodes[MAX_NODES];  int main() {  int headAddress, n

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

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

相关文章

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及&#xff0c;IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接&#xff0c;还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能&#xff0c;并对…

王道c语言-chap13 栈实例

王道c语言-chap13 栈实例 #include <iostream>#define END -1 #define MaxSize 50typedef int ElemType; typedef struct {int data[MaxSize];int top; } SqStack;void InitStack(SqStack &s) {s.top-1; }void PrinfSqStack(SqStack s) {for (int i 0; i < s.to…

什么是布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的主要优点是占用空间少、查询速度快&#xff0c;并且支持高效的插入和查询操作。 布隆过滤器由一个位数组和多个哈希函数构成。初始时&#xff0c;…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

解决antd vue 的table列表过宅内容换行和过长有空白列的问题

主要有两个注意点 1、columns数组中保留一个对象不设置宽度&#xff0c;其余都要设置宽度&#xff1b; 2、HTML中scroll要设置为{x: 足够长的固定宽度}&#xff1b; 具体代码如下&#xff1a; <a-tableref"table"size"middle"rowKey"rowSerial&qu…

字符串函数---(1)

字符函数 文章目录 前言1.strlen 的使用和模拟实现2.strcpy 的使用和模拟实现3. strcat 的使用和模拟实现4. strcmp 的使用和模拟实现 前言 上一篇我们学习了字符函数&#xff0c;下来我们学习常见的字符串函数 1.strlen 的使用和模拟实现 size_t strlen(const char *str) 字…

(70min)字节暑假实习二面(已挂)

还没找到工作的小伙伴加油&#xff01; 字节看面评果然名不虚传。。 面试官&#xff1a; 看你一面基础也回答得不好&#xff0c;没事&#xff0c;那我就不问你八股&#xff0c;多问项目吧。 然后开始鞭打项目。 项目使用mq&#xff0c;从背景的&#xff0c;技术选型&#xff0…

DDOS攻击防御介绍

DDOS&#xff1a;分布式拒绝服务攻击 瞬间收到大量数据 总带宽是有限的 合法用户访问的时候&#xff0c;被非法方法流量占据 无法溯源 流量清洗&#xff1a;AntiDdos 边界&#xff0c;旁挂的 备用域名&#xff0c;ip更换 机房会提供解决方案 解决不了问题&#xff0c;就干…

【真实体会】花几百块买ChatGPT4.0账号一年值得吗?

GPT4.0使用体验及价值 性能提升: GPT4比GPT3.5在内容质量和数量上有显著提高&#xff0c;使得知乎等平台的收益增加。 功能丰富: GPT4支持文本、图片、文件问答&#xff0c;而GPT3.5仅支持文本。GPT4内置多种专业工具&#xff08;GPTS&#xff09;&#xff0c;如设计师LOGO的A…

关于我的经历

技能 1 Java基础扎实&#xff0c;具备并发编程经验&#xff0c;熟悉JMM、线程通信线程安全、锁、原子类、阻塞队列、并发容器、线程池原理。清楚并发内容的实现原理。阅读过部分JDK源码。 深入了解JVM虚拟机&#xff1a;内存模型、GC、垃圾回收算法、以及垃圾回收器&#xff0…

Android Studio实现内容丰富的安卓视频管理平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号081 1. 开发环境 android stuido 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频 6.个人中心 7.我的收藏 8.浏览历史 3.系…

蓝桥杯第14届模拟赛最大连通分块(dfs)

问题描述(答案148)   小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 001011101000100011111111111010000010010…

Redis高阶使用消息队列分布式锁排行榜等

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

【哈希表】算法例题

目录 五、哈希表 39. 赎金信 ① 40. 同构字符串 ① 41. 单词规律 ① 42. 有效的字母异位词 ① 43. 字母异位词分组 ② 44. 两数之和 ① 45. 快乐数 ① 46. 存在重复元素 ① 47. 最长连续序列 ② 五、哈希表 39. 赎金信 ① 给你两个字符串&#xff1a;ransomNote 和 m…

Linux课程_____网络管理

一、查看接口信息 1. ifconfig 查看所有活动网络接口的信息 ifconfig -a 查看所有网络接口信息 ifconfig 直接加网络接口 查看指定网络接口信息 1.1查看指定接口IP [rootlocalhost ~]# ip addr show ens160 1.2设置网络接口的IP地址 # ifconfig eth0 192.168.152.133 …

考研模拟面试-题目【攻略】

考研模拟面试-题目【攻略】 前言版权推荐考研模拟面试-题目前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 最后 前言 2023-10-19 12:00:57 以下内容源自《考研模拟面试…

全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库

统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴&#xff0c;则是研究者常用的途径。目前国…

DC-DC 变换集成电路芯片MC34063A测试参数介绍

MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、降压及电压反转型 DC-DC 变换器。…

Java基础知识八股

1.为什么静态方法无法调用非静态方法&#xff1f; 回答&#xff1a;因为静态方法是随着类的加载而加载&#xff0c;而非静态方法则是随着类的实例化才会被加载&#xff0c;生存周期不一样&#xff0c;所以静态方法的生命周期更长 2.Java–内部类持有外部类导致内存泄露的原因和…

基于springboot+vue的火锅店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…