从链接列表中删除重复元素

时间:2013-12-02 19:15:48

标签: java linked-list nodes

我正在使用以下代码实现链接列表。它将打印25 26 25 25 28 null。问题是我试图删除25的副本,所以我希望最终输出为25 26 28 null。是否可以这样做?

public void addBeginning(Integer val){
    node = new Node(val,null);
}

private void addLast(Node<Integer> node, Integer item){
if(node.next != null){
          addLast(node.next, item);
    }else{
          node.next = new Node<Integer>(item, null);
    }       
}

public void add(Integer val){
    if(node == null){
        addBeginning(val);
    }else{
        addLast(node,val);
    }
}

主要班级

//set is class name;
Set set = new Set();
set.add(25);        
set.add(26);
set.add(25);
set.add(25);
set.add(28);

3 个答案:

答案 0 :(得分:1)

如果链接列表中的项目没有被排序,则无法有效地完成,因为您必须在列表的每个打印中消除重复(或缓存它)。

您的链接列表类的名称(Set)假定您要实现一个集合。在这种情况下,最好的解决方案是根本不存储复制,但是在插入时对链接列表中的唯一项目进行排序(因此您不必在每次推送/弹出操作时检查整个链接列表是否匹配)。

请注意,使用(二进制)搜索树而不是链接列表可以更有效地实现集合。

答案 1 :(得分:1)

为防止重复进入设置,请创建以下功能:

boolean canAdd(Integer value) {
  Node current = this.node;
  while (current !=null) {
    if (current.value.equals(value)) {
      return false;
    }
    current = current.next;
  }
  return true;
}

add()函数中使用此功能来检查是否应添加值。

在实际应用程序中,您可以使用LinkedHashSet来实现相同的功能。

答案 2 :(得分:0)

按如下方式构建HashSet

new java.util.HashSet(listCollection);

...你将拥有没有重复元素的集合。