从链表中删除重复元素 - Java

时间:2017-11-01 02:27:28

标签: java linked-list

编辑

我决定使用HashSet,因为它具有O(N)。但是,我仍然有一个问题,即它没有删除所有重复的数字,10 13 11 11 12 11 10 12 11。 它返回:10 13 11 12 10 11

static void removeDups(Node node) {
        HashSet<Integer> values = new HashSet<Integer>();
        Node previous = null;
        while(node != null) {
            if(values.contains(node.data)) 
                previous.next = node.next;
            else
                values.add(node.data);
                previous = node;

                node= node.next;

    }
    }

不相关

我试图从链表中删除重复的元素,但由于某种原因,它不会删除最后一个重复元素。例如,如果列表是10,11,12,11,12,9,11,它返回:10,11,12,9,11。

     public static void removeDups1(Node head){
        if(head == head.next)
            head = head.next.next;
        Node fastptr =head;
        Node slowptr = head;
        while(slowptr.next != null && fastptr.next.next !=null) {
            if(slowptr.data == fastptr.data) {
                fastptr.next = fastptr.next.next;}

            slowptr = slowptr.next;
            fastptr = fastptr.next;

   }}

4 个答案:

答案 0 :(得分:1)

提前检查fastptr.next.next == null退出循环。

答案 1 :(得分:0)

您的算法正在尝试查找链接列表中当前位置到下两个位置的每个元素是否有重复项。但重复项可以出现在链表中的任何位置。因此,对于每个元素,它应该再次遍历链表。

那将是一个O(n ^ 2)解决方案

更好的方法是维护散列以跟踪已访问过的数据。

这将是一个O(n)解决方案。

答案 2 :(得分:0)

我认为,因为在开始时你将fastptrslowptr都指向同一个节点,并且总是在结束时将它们指向同一个节点,你是总是在这里比较相同的节点,对算法没有任何价值:

 if(slowptr.data == fastptr.data)

无论如何,algorightm的逻辑似乎都错了。

像其他人说的那样,你应该做两个循环,一个在另一个循环中:第一个循环到slowptr,第二个循环到fastptr

尝试根据这个命题实施:

对于所有节点(由slowptr指向,第一个循环),对于所有后续节点(第二个循环),确实看它们是否相同。

答案 3 :(得分:0)

当我查看您的代码时,我看不到真正的Java。但无论如何,@ Aishwarya说更好的解决方案是构建一个地图或哈希集以获得更好的性能。使用Java内置函数甚至更简单。只是做:

LinkedList<Node> yourList = ...
LinkedList<Node> filteredList = new LinkedList<>(new HashSet<Node>(yourList));

要使这项工作正常,您必须确保Node equals(Object o)hashCode()得到正确实施。

然后您的(通用)重复删除功能可能是:

public static void removeDups(LinkedList pList) {
    return new LinkedList(new HashSet(pList));   
    // indeed specifying <Node> is not really needed
}