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

检查java中两个链表之间的子集,java,linked-list,Java,Linked List,我正在尝试编写一个布尔方法isSubset(如果集合a中的每个元素都在集合B中,则返回一个布尔值,否则返回false),其中方法调用可以这样编写setA.subsetOf(setB)。我的想法是提取setA的每个元素,并将其与setB进行比较。如果setA的第一个元素与setB中的任何元素匹配,则转至setA中的下一个元素进行检查。若setA中的所有元素都与setB中的任何元素匹配,则方法返回true,否则(并非setA中的所有元素都在setB中)返回false。我已经编写了检查元素是否包含在链

我正在尝试编写一个布尔方法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;
  }

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

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


有关此主题的详细信息,请访问:。

首先,您的contain方法有一个小错误。cursor.getNext()的条件无效应该是
光标!=无效。这样做可以防止搜索空集(这会导致代码崩溃),并允许搜索列表中的最后一个节点。如果您返回状态,您的代码将运行得更快之后<代码>状态=真

isSubset的结构与您创建的循环非常相似;循环如下所示:

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

你不使用的原因是什么?可能是重复的。不要重复你已经问过的问题。相反,问问自己为什么没有得到答案,并改进你的问题。您已经被多次询问节点类是什么,以及为什么不使用java.util.set。@GordonBailey谢谢,但假设我不使用任何节点类API@JBNizet我已经更新了我的问题,但似乎没有人对我的问题感兴趣。很抱歉重新发布,这是removedYou正在询问如何使用我们一无所知的类实现某些东西。给我们看看你的代码。试试看。并解释为什么不使用标准类并尝试重新实现自己的类。在你最初的问题中。谢谢,但我在if得到了一个NullPointerExceptioncondition@user1986597如果在你的contain方法中发生了这种情况,那就意味着你在某个点上传递null作为目标哦,你是对的,因为头后面的第一个节点是一个虚拟节点,我相信@Nabou已经按照你说的方式编写了代码,但是我在
if(target.equals(cursor.getElement())
方法的
contain()
条件中得到了
NullPointerException