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

举报
牛哄哄的柯南 发表于 2022/02/14 11:23:35 2022/02/14
【摘要】 移除重复节点编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。==题意:就是让我们去除单链表中的重复节点,只保留第一个。====思路:递归求解,用一个set存放节点的...

移除重复节点

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

示例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

 
看完如果对你有帮助,感谢点赞支持!
在这里插入图片描述
加油!

共同努力!

Keafmd

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。