L2-002 链表去重(Java)

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:

输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过104的整数,下一个结点是下个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

解题思路

  1. 根据给定的输入格式创建链表
  2. 遍历链表,使用一个哈希表来存储已遇到的节点的绝对值。如果某个绝对值是第一次遇到,则保留这个节点;否则,将其移动到另一个链表。
  3. 输出链表:按照指定的格式输出两个链表。

解题代码

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;class Node {int addr;int value;int next;Node(int addr, int value, int next) {this.addr = addr;this.value = value;this.next = next;}
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int headAddr = scanner.nextInt(); // 链表头节点地址int n = scanner.nextInt(); // 节点总数Map<Integer, Node> addressToNodeMap = new HashMap<>();for (int i = 0; i < n; i++) {int addr = scanner.nextInt();int value = scanner.nextInt();int next = scanner.nextInt();addressToNodeMap.put(addr, new Node(addr, value, next));}scanner.close();Set<Integer> seen = new HashSet<>();//保存去重后的链表Map<Integer, Integer> uniqueNextMap = new HashMap<>();//保存被删除的链表Map<Integer, Integer> removedNextMap = new HashMap<>();Integer uniqueHead = null, removedHead = null;Integer lastUniqueAddr = null, lastRemovedAddr = null;// 从头节点开始 每循环1次都以节点的next节点递增for (Integer currentAddr = headAddr; currentAddr != -1; currentAddr = addressToNodeMap.get(currentAddr).next) {// 获取当前节点的节点属性。addr、value、nextNode currentNode = addressToNodeMap.get(currentAddr);// 如果 当前节点的value没有重复则添加if (seen.add(Math.abs(currentNode.value))) {// 第一次添加的时候uniquehead为nullif (uniqueHead == null) {uniqueHead = currentAddr;} else {// 放置节点的链表顺序uniqueNextMap.put(lastUniqueAddr, currentAddr);}// 更新节点lastUniqueAddr = currentAddr;} else {if (removedHead == null) {removedHead = currentAddr;} else {removedNextMap.put(lastRemovedAddr, currentAddr);}lastRemovedAddr = currentAddr;}}if (lastUniqueAddr != null) {uniqueNextMap.put(lastUniqueAddr, -1);}if (lastRemovedAddr != null) {removedNextMap.put(lastRemovedAddr, -1);}printList(uniqueHead, uniqueNextMap, addressToNodeMap);printList(removedHead, removedNextMap, addressToNodeMap);}private static void printList(Integer headAddr, Map<Integer, Integer> nextMap, Map<Integer, Node> nodeMap) {Integer currentAddr = headAddr;while (currentAddr != null && currentAddr != -1) {Node node = nodeMap.get(currentAddr);System.out.printf("%05d %d ", node.addr, node.value);// getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。Integer nextAddr = nextMap.getOrDefault(currentAddr, -1);if (nextAddr == -1) {System.out.println(-1);} else {System.out.printf("%05d\n", nextAddr);}currentAddr = nextAddr;}}
}

 如果有大佬可以解决运行超时问题,希望能向您学习

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

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

相关文章

对列表的元素进行验证

摘要&#xff1a;开发中经常需要校验用户提交的值是否满足要求&#xff0c;Valid可用于方法参数、返回值等的验证&#xff0c;但是对于参数为列表时无效&#xff0c;此处记录几种对列表进行验证的方法 Valid 注解通常用于验证单个对象的字段&#xff0c;而不是整个列表。仅添加…

NetSuite Mass Update 批量更新功能

NetSuite中有一个小而精的便捷功能&#xff0c;但是也是一个很容易在实践中被大家遗忘的隐藏功能&#xff0c;就是Mass Update批量更新&#xff0c;在此想和各位分享一下&#xff5e;该功能主要是可以帮助用户快速将符合固定标准的记录中的单个/多个字段直接进行批量更新。如果…

快速批量将图片变成圆角怎么弄?教你一键将图片批量加圆角

在我们日常工作中&#xff0c;在设计图片的时候会要求将直角变成圆角&#xff0c;那么为什么要这么做呢&#xff1f;首先从圆角的设计语言上来说说&#xff0c;圆角看起来很现代&#xff0c;传达给人的感觉是温和友善的&#xff0c;被广泛的应用在产品中的图标、按钮等地方。而…

旷视IPC网络摄像机RTSP地址规则

主码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0000 子码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0001 三码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0002 带用户名密码格式&#xff0c;主码流&#xff1a;rtsp://admin:pw…

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…

检测和处理异常之封装内建函数

​我们现在给出一个交互操作的例子 - 从最基本的错误检测开始, 然后逐步改进它, 增强代码的健壮性. 这里的问题是把一个用字符串表示的数值转换 为正确的数值表示形式, 而且在过程中要检测并处理可能的错误. float() 内建函数的基本作用是把任意一个数值类型转换为一个浮点数…

代码第二十四天-寻找旋转排序数组中的最小值Ⅱ

寻找旋转排序数组中的最小值Ⅱ 题目要求 解题思路 二分法 当遇到两个left、right两个位置值相同时候&#xff0c;可以选择将 right right-1 代码 class Solution:def findMin(self, nums: List[int]) -> int:left,right0,len(nums)-1while left<right:mid(leftright…

HarmonyOS—配置编译构建信息

在进行应用/服务的编译构建前&#xff0c;需要对工程和编译构建的Module进行设置。API Version 9、API Version 8与API Version 4~7的构建体系不同&#xff0c;因此在设置编译构建信息时也存在差异&#xff1a; API Version 9&#xff1a;需要对构建配置文件、构建脚本、应用依…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

Keepalived群集

目录 一、Keepalive基础 1.1 vrrp技术 1.2 VRRP相关技术 1.3.VRRP工作过程 1.4.Keeplived、VRRP及其工作原理 1.5.Keepalived体系主要模块及其作用 1.6.配置LVSKeepalived高可用群集 配置NFS服务器192.168.52.110 192.168.52.120web1服务器 192.168.52.130web2服务器 配…

哇!!!!这个个人博客好好看!!!

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

前端算法之归并排序

5、归并排序&#xff08;Merge Sort&#xff09; 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

C++性能优化 —— TCMalloc的原理与使用

一、TCMalloc简介 1、TCMalloc简介 TCMalloc(Thread-Caching Malloc&#xff0c;线程缓存的malloc&#xff09;是Google开发的内存分配算法库&#xff0c;最初作为Google性能工具库 perftools 的一部分&#xff0c;提供高效的多线程内存管理实现&#xff0c;用于替代操作系统…

基于AFDPF主动频率偏移法的孤岛检测Simulink仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于AFDPF主动频率偏移法的孤岛检测Simulink仿真。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 36 4.系统原理简介 在分布式发电系统中&#xff0c;孤…

express基础

express express介绍 官网传送门基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架express特点 Web 应用 Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架&#xff0c;它提供一系列强大的特性&#xff0c;帮助你创建各种 Web 和移动设备应用。…

指针的深入解读笔记

指针是什么 指针是指向内存单元的编号(地址),可以快速访问地址,加快程序运行速度. 在指针中一般用到两个操作符: * 解引用操作符 也是定义指针时候的操作符 int *p;//定义一个类型为 int 的 指针 *p 0;解引用p指向的地址 并且赋值为0 & 取地址操作符 in…

详讲Spring的面向切片编程(AOP)二

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

3月7日代码随想录组合及优化

77.组合 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3…

【手游联运平台搭建】游戏平台的作用

随着科技的不断发展&#xff0c;游戏行业也在不断壮大&#xff0c;而游戏平台作为连接玩家与游戏的桥梁&#xff0c;发挥着越来越重要的作用。游戏平台不仅为玩家提供了便捷的游戏体验&#xff0c;还为游戏开发者提供了广阔的市场和推广渠道。本文将从多个方面探讨游戏平台的作…

复习C++

统计每个月兔子的总数 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){} 猴子吃桃子 #include<…