如何构建企业网站,wordpress调用最近更新文章,域名注册平台的网站怎么做,91人才网赣州招聘网给定一个带整数键值的链表 L#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K#xff0c;只有第一个绝对值等于 K 的结点被保留。同时#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15#xff0c;你需要输出去重后…给定一个带整数键值的链表 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 解题思路
根据给定的输入格式创建链表遍历链表使用一个哈希表来存储已遇到的节点的绝对值。如果某个绝对值是第一次遇到则保留这个节点否则将其移动到另一个链表。输出链表按照指定的格式输出两个链表。
解题代码
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(); // 节点总数MapInteger, 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();SetInteger seen new HashSet();//保存去重后的链表MapInteger, Integer uniqueNextMap new HashMap();//保存被删除的链表MapInteger, 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, MapInteger, Integer nextMap, MapInteger, 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;}}
} 如果有大佬可以解决运行超时问题希望能向您学习