移除重复节点Java版(力扣)

简介: 移除重复节点Java版(力扣)

移除重复节点


编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。


示例1:

输入:[1, 2, 3, 3, 2, 1]

输出:[1, 2, 3]


示例2:

输入:[1, 1, 1, 1, 2]

输出:[1, 2]


提示:

链表长度在[0, 20000]范围内。

链表元素在[0, 20000]范围内。


题意:就是让我们去除单链表中的重复节点,只保留第一个。


思路:递归求解,用一个set存放节点的值,如果这个节点的值没出现过就存放到set中,保留当前节点;如果这个节点的值出现过就舍弃当前节点。


代码:


class Solution01061 {
    private Set<Integer> set =new HashSet<Integer>();
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null) //说明到了链表尾端
            return null;
        if(!set.contains(head.val)){ //这个值第一次出现
            set.add(head.val); //set中加入这个值,用于下次判断
            //只要这个链表不是空的,那么第一次经过if时的第一个节点就会保存下来,所以只要这个链表不是空的,至少会有一个节点
            //这句相当于保留了这个节点,然后往后面挂下一个符合要求的节点
            head.next=removeDuplicateNodes(head.next);
            // 这句就相当于保留了当前节点
            return head;
        }else{ //这个值出现过了
            // 不要当前节点,直接对下一个节点验证
            return removeDuplicateNodes(head.next);
        }
    }
}

完整代码(含测试样例):


package com.Keafmd.day0106;
import java.util.HashSet;
import java.util.Set;
/**
 * Keafmd
 *
 * @ClassName: RemoveDuplicateNode
 * @Description: 移除重复节点 https://leetcode-cn.com/problems/remove-duplicate-node-lcci/
 * @author: 牛哄哄的柯南
 * @date: 2021-01-06 19:31
 */
public class RemoveDuplicateNode {
    public static void main(String[] args) {
        Solution solution = new Solution();
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(3);
        ListNode listNode5 = new ListNode(2);
        ListNode listNode6 = new ListNode(1);
        ListNode listNode7 = new ListNode(1);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;
        listNode6.next = listNode7;
        ListNode result = solution.removeDuplicateNodes(listNode1);
        System.out.println(result.val);
        System.out.println(result.next.val);
    }
}
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}
class Solution {
    private Set<Integer> set =new HashSet<Integer>();
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null) //说明到了链表尾端
            return null;
        if(!set.contains(head.val)){ //这个值第一次出现
            set.add(head.val); //set中加入这个值,用于下次判断
            //只要这个链表不是空的,那么第一次经过if时的第一个节点就会保存下来,所以只要这个链表不是空的,至少会有一个节点
            //这句相当于保留了这个节点,然后往后面挂下一个符合要求的节点
            head.next=removeDuplicateNodes(head.next);
            // 这句就相当于保留了当前节点
            return head;
        }else{ //这个值出现过了
            // 不要当前节点,直接对下一个节点验证
            return removeDuplicateNodes(head.next);
        }
    }
}

测试结果:


1
2
Process finished with exit code 0
相关文章
|
5月前
|
Java
Java中ReentrantLock中部分加锁取消节点源码分析
Java中ReentrantLock中部分加锁取消节点源码分析
49 13
|
5月前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
43 1
|
3月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
39 4
|
3月前
|
设计模式 SQL 安全
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
29 0
|
5月前
|
缓存 Java
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
|
4月前
|
Web App开发 分布式计算 大数据
MaxCompute操作报错合集之配置归并节点,出现java.lang.NullPointerException: null错误提示,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
4月前
|
Java
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.
|
5月前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
40 0
|
5月前
|
存储 Java
JAVA数据结构刷题 -- 力扣二叉树
JAVA数据结构刷题 -- 力扣二叉树
49 0
|
5月前
|
XML Java 数据格式
java使用Document类解析xml并创建子标签节点
java使用Document类解析xml并创建子标签节点
下一篇
无影云桌面