LinkedList:删除重复项

时间:2013-10-14 23:12:04

标签: java data-structures

我知道这是一个重复的问题,但我的问题不同 帮助我理解这段代码的几行。
它从单个链表中删除重复的节点。

public class DeleteDuplicates {

    static void deleteDups(LinkedListNode n) {
        Hashtable table = new Hashtable();
        LinkedListNode previous = null;
        while(n!=null) {
            if(table.containsKey(n.data)) {
                previous.next = n.next;
            } else {
                table.put(n.data, true);
                previous = n;
            }
            System.out.println(n.next.data);
            n = n.next;
        }
    }

    public static void main(String[] args) {
        LinkedListNode node_1 = new LinkedListNode("first");        
        LinkedListNode node_2 = new LinkedListNode("second");
        node_1.next = node_2;
        LinkedListNode node_3 = new LinkedListNode("third");
        node_2.next = node_3;
        LinkedListNode node_4 = new LinkedListNode("second");
        node_3.next = node_4;

        LinkedListNode  current = node_1;
        deleteDups(current);
        while (current != null) {
            System.out.println(current.data);
            current = current.next;
        }

    }

}

我的问题是:

  1. LinkedList n如何跳过重复节点?我不理解previous节点的使用以及它如何帮助跳过重复节点。
  2. 使用Hashtable有多重要?我可以使用任何其他集合,例如HashSet吗?

3 个答案:

答案 0 :(得分:2)

你已经对问题2有了很好的答案,所以我只关注问题1(顺便说一句,你应该只在每个帖子中提出1个问题)。这是删除重复的工作方式:

在循环的每次迭代中,previous在节点n之前保存对列表中节点的引用。因此,当n设置为node_4时,previous设置为node_3。因此,previous.next = n.next相当于node_3.next = node_4.next,因为您没有为node_4.next设置值等同于node_3.next = null,这会产生node_3的效果列表中的最后一个节点,从而从列表中删除node_4

如果node_4不是重复node_3,而是重复previous,那么node_2将是nnode_3将是{{} 1}}并且所做的更改将等同于node_2.next = node_3.next,即node_2.next = node_4或简单的英语,“将node_2之后的下一个节点设为node_4”,从而有效地删除node_3清单。

答案 1 :(得分:0)

1)LinkedList没有跳过重复的节点,它被映射出来 - 接下来指向复制后的条目。
2)认为LinkedList允许重复,但Hashtable不允许 - >从这个结论中得出结论

答案 2 :(得分:0)

您可以使用您喜欢的任何数据结构来检测重复项。

从实现的角度来看,哈希是很好的,因为它们采用(摊销)常量时间来确定特定元素是否是重复的。

从API的角度来看,Collection.Set界面很好,因为它保证没有重复的项目。

所以你使用HashSet的想法看起来非常直观,特别是因为你只对重复的密钥感兴趣,而不考虑实际的节点对象。