检查java中两个链表之间的子集

时间:2013-01-27 22:37:09

标签: java linked-list

我正在尝试编写一个布尔方法isSubset(如果集合A中的每个元素都在集合B中则返回一个布尔值,否则返回false),其中方法调用可以像这样setA.subsetOf(setB)一样编写。我的想法是提取setA的每个元素并将其与setB进行比较。如果setA的第一个元素与setB中的任何元素匹配,则继续执行setA中的下一个元素以进行检查。如果setA中的所有元素都与setB中的任何元素匹配,则方法返回true,否则(并非setA中的所有元素都在setB中)返回false。我已经编写了检查元素包含到链表的方法,如下所示:

  public boolean contain (Object target) {
      boolean status = false;
      Node cursor;
      for (cursor = head; cursor.getNext() != null; cursor = cursor.getNext()) {
          if (target.equals(cursor.getElement())) 
              status = true;
      }   
      return status;
  }

由于我仍然对链表操作的语法感到困惑,我的问题是如何提取每个元素并完成剩下的工作。任何帮助,将不胜感激。 节点被声明

  public Node(Object o, Node n) {
    element = o;
    next = n;
  }

SLinkedList

  public SLinkedList() {
    head = new Node(null, null); // create a dummy head
    size = 0;
  }

2 个答案:

答案 0 :(得分:0)

检查集合A是否是集合B的子集的逻辑是正确的。您询问了“如何提取每个元素”,但您的contain代码表明您已经知道如何遍历链接列表。因此,只需以相同的方式遍历集合A,并为遍历的每个元素调用setB.contain(cursor)。如果对任何元素返回false,则立即返回false。

以这种方式做事的问题是,如果列表很大,它将非常慢。我猜你是编程的新手,可能从未听说过“大O”符号。这是一种描述算法性能如何随输入数据大小变化而变化的方式。您的subsetOf方法将为O(n ^ 2)。如果setB存储在哈希集而不是链表中,那么它将是O(n),很多更好。

您可以在http://en.wikipedia.org/wiki/Time_complexity了解有关此主题的更多信息。

答案 1 :(得分:0)

首先,你的contains方法有一个小bug。条件cursor.getNext() != null;应为cursor != null;。这样做可以防止搜索空集(这会导致代码崩溃)以及允许搜索列表中的最后一个节点。如果您在return status;之后status=true;

,则代码运行速度会更快

isSubset的结构与你创建的循环非常相似;循环看起来像这样:

for(cursor = head; cursor!=null; cursor.getNext()){
  if(setB.contain(cursor.getElement()) == false){
    return false;
  }
}