Java 从单链表中删除重复项

Java 从单链表中删除重复项,java,algorithm,Java,Algorithm,有没有一种方法可以这样修改链表,这样我们就可以从链表中删除所有重复项 我们的想法是,它需要线性时间和恒定的内存使用。我试图将列表中的所有元素放入HashMap中,这给了我们恒定的时间但线性的内存使用 还有其他方法吗?您可以使用stream().distinct()方法来执行线性时间: List<String> result = list.stream() .distinct() .collect(Collectors.toList()); List

有没有一种方法可以这样修改链表,这样我们就可以从链表中删除所有重复项

我们的想法是,它需要线性时间和恒定的内存使用。我试图将列表中的所有元素放入
HashMap
中,这给了我们恒定的时间但线性的内存使用

还有其他方法吗?

您可以使用
stream().distinct()
方法来执行线性时间:

List<String> result = list.stream()
        .distinct()
        .collect(Collectors.toList());
List result=List.stream()
.distinct()
.collect(Collectors.toList());

从算法上讲,这听起来是不可能的(或者这里有人会让我大吃一惊)

但是,您可以创建一个没有重复项的列表模拟,而不需要这样做任何算法:

public class SimulatedNoDuplicatesList extends LinkedList {
    private List originalList;
    SimulatedNoDuplicatesList(List original) {
        originalList = original;
    }
// override all the methods that you want to use with the old list. for example
//   @Override
    public Object get(int i) {
        if (!super.contains(i) && originalList.contains(i)) {
            super.add(originalList.get(i));
        }
        return super.get(i);
    }
}

这是不可能的。线性内存使用有什么问题?如果您想要恒定的内存使用率,则需要n^2个操作来删除重复项。这远远不是恒定的内存使用率。它甚至不修改列表。它创建了另一个。是的,它可以在线性时间内完成。这就是你的代码所做的。@JBNizet我的错误。感谢您的更正。或者只需
Set noDups=newlinkedhashset(listWithDups)