PAT-Deduplication on a Linked List (25)

本文介绍了一道PAT考试中的链表题目,通过定义节点并利用HashMap和HashSet来去除重复节点,最终形成两个独立的链表。文章提供了详细的Java代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

链表的题,将重叠的去掉,组成两个链表。

解答:

PAT的链表题都是一个套路,定义节点Node,并把id和Node对象放到map中,方便寻找。

这里为了方便查找有没有重复,使用了HashSet,因为Hashset有contains方法可以方便检查是否重复。

1、首先要遍历所有的节点,防止会有无用节点

2、节点的next需要重写

3、尾节点一定要定位-1;

具体的java代码实现:

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.HashSet;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String head = sc.next();
        int n = sc.nextInt();
        HashMap<String,Node> map = new HashMap<>();
        for(int i =0;i<n;i++){
            String tmpAds = sc.next();
            Node tmpNode = new Node();
            tmpNode.ads=tmpAds;
            tmpNode.key=sc.nextInt();
            tmpNode.next=sc.next();
                
            map.put(tmpAds,tmpNode);
        }
        sc.close();
        ArrayList<Node> list = new ArrayList<Node>();
        ArrayList<Node> reList = new ArrayList<Node>();
        HashSet<Integer> set = new HashSet<>();
        while(!head.equals("-1")){
            Node tmp = map.get(head);
            int val = Math.abs(tmp.key);
            if(!set.contains(val)){
                list.add(tmp);
                set.add(val);
            }
            else{
                reList.add(tmp);
            }
            head = map.get(head).next;
        }
          
        for(int i=0;i<list.size()-1;i++){
            list.get(i).next = list.get(i+1).ads;
        }
        if(!list.isEmpty())
            list.get(list.size()-1).next="-1";
        for(int i=0;i<reList.size()-1;i++){
            reList.get(i).next = reList.get(i+1).ads;
        }
        if(!reList.isEmpty())
            reList.get(reList.size()-1).next = "-1";
  
        printList(list);
        printList(reList);
    }
    private static void printList(ArrayList<Node> list){
        for (Node tmp : list) {
            System.out.println(tmp.ads + " " + tmp.key + " " + tmp.next);
        }
    }
  
    private static class Node{
        String ads;
        int key;
        String next;
         
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值