2013-03-27 61 views
0

我做了我自己的Node类和我自己的LinkedList类,我想建立一个函数来计算我的LinkedList中有多少个不同的节点。如何统计我的链表中有多少个不同的节点?

我曾尝试与此代码,但它不工作:

for (int i = 0; i < quantityOfNode(); i++) { 
    boolean isDistinct = true; 

    for (int j = 0; j < i; j++) { 
     if (node.getInfo().equals(node.getNext().getInfo())) { 
      isDistinct = false; 
     } 
    } 
    if (isDistinct) { 
     nbDistinct++; 
    } 
    if (node.getNext().getNext() != null) { 
     node= node.getNext(); 
    } 
} 

为例:

 list.add(3); 
    list.add(2); 
    list.add(5); 
    list.add(3); 
    list.add(3); 
    list.add(8); 

这是supose给我4个不同的节点,但我得到5,因为节点3被计数2次

现在我已经尝试在第j个循环中使用第二个节点,并且为相同的输入现在给我2而不是4

这里是新的代码我试过,但仍不能工作:

  for (int i = 0; i < quantityOfNode(); i++) { 
      boolean isDistinct = true; 
      for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node2.getInfo())) { 
        isDistinct = false; 

       } 

       if (node2.getNext() != null) { 
        node2 = node2.getNext(); 
       } 

      } 
      if (isDistinct) { 
       nbDistinct++; 
      } 
      if (node.getNext() != null) { 
       node= node.getNext(); 
      } 
     } 
+3

以何种方式它不工作?给出一个输入和预期输出以及实际输出的例子。 – Patashu 2013-03-27 23:10:49

+0

'length()'方法做了什么? – 2013-03-27 23:12:52

+0

list.add(3); \t \t list.add(2); \t \t list.add(5); \t \t list.add(3); \t \t list.add(3); \t \t list.add(8); 我有4个不同的节点,但我得到5 – pharaon450 2013-03-27 23:13:11

回答

1

j循环没有踏node前开始i - 它总是比较相同的一对节点,因此没有任何功能。

你需要的东西,如:

... 
Node earlierNode = rootNode; 
for (int j = 0; j < i; j++) { 
    if (earlierNode.getInfo().equals(node.getInfo())) { 
     isDistinct = false; 
    } 
    earlierNode = earlierNode.getNext(); 
} 
... 
+0

对,我怎么能让我的j循环工作plz? – pharaon450 2013-03-27 23:36:50

+0

@ pharaon450 - 增加了建议。 – OldCurmudgeon 2013-03-27 23:41:13

+0

谢谢你,我还在尝试它仍然不工作:(也许有一种方式,我可以与你聊天,即时通讯新的到这个网站 – pharaon450 2013-03-27 23:47:09

0

使用设置

Set<Node> mySet = new HashSet<Node>(list); 
answer = mySet.size(); 

这取决于你实施的hashCode并在节点级等于,或者你可以使用TreeSet的和一个比较器。

Comparator<Node> myComparator = new MyCustomComparator();// you have to define your comparator. 
Set<Node> mySet = new TreeSet<Node>(myComparator); 
mySet.addAll(list); 
answer = mySet.size(); 
+0

即时对不起,我不知道设置,所以我不能使用它,但谢谢 – pharaon450 2013-03-27 23:30:26

2

您可以使用Set。

Set set = new HashSet(); 
Node cur = list.head; 
while(cur != null) { 
    set.add(cur.getInfo()); 
    cur = cur.getNext(); 
} 
return set.size(); 

这不使用泛型,因为我不知道你有什么类型的getInfo。或者,如果你不能使用一个集合,你应该尝试摆脱你的'索引'变量(我和j)。你真的想把你的应用逻辑集中在你实际拥有的东西上,而不是隐式计算的值。当您的当前节点变为空时,而不是当您提前一定次数时,您希望停止。如果这不合逻辑,请告诉我。

对于每个节点,检查之前的节点以查看该节点是否存在。我每次都从头开始,因为我不知道你是否有双重链接。无论哪种方式都是相同的复杂性,但是在排序列表中,这是不太理想的。

Node cur = list.head; // for each node 
int nbDistinct = 0; 
while(cur != null) { // go until we're out of nodes 
    Node check = list.head; // check the first node 
    boolean isDistinct = true; // assume distinct 
    while(check != cur && isDistinct) { // stop if we found a match OR if our checker caught up to our current node 
     isDistinct |= !check.getInfo().equals(cur.getInfo()); // essentially "if(check.getInfo().equals(cur.getInfo()) isDistinct = true;" 
     check = check.getNext(); // advance the checker 
    } 
    if(isDistinct) nbDistinct++; 
    cur = cur.getNext(); // advance the current node 
} 
+0

对不起,我不知道设置所以即时尝试不使用它,但谢谢 – pharaon450 2013-03-27 23:28:37

+0

我也有一个替代解决方案,与评论。 – corsiKa 2013-03-27 23:31:01

+0

我会试一试谢谢你,但你能告诉我为什么我应该停止当我找到一场比赛?我的目标是要知道我的链表中有多少个不同的节点 – pharaon450 2013-03-27 23:36:00

2

第一个问题:

如果你的for循环写过这样,它并没有结束链表的长度去:你为什么需要这个

for (int i = 0; i < length(); i++) {

呢?

  if (node.getNext().getNext() != null) { 
       node= node.getNext(); 
      } 

特别是,这种代码可能意味着刚刚结束节点之前两次评估,因为超越它的节点是null。它不一定会让你的算法错误,但它味道不好,我不喜欢它。

问题二:

  for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node.getNext().getInfo())) { 
        isDistinct = false; 
       } 
      } 

这是计算重复,因为你不存储和推进你是比较反对的第二个节点的位置的错误方式。尝试类似

  Node node2 = firstNode(); //idk what method gets the first node :) 
      for (int j = 0; j < i; j++) { 
       if (node.getInfo().equals(node2.getInfo())) { 
        isDistinct = false; 
        break; //optimization, stop as soon as we find a duplicate 
       } 
       node2 = node2.GetNext(); 
      } 

最后,每当面临码不起作用,附加一个调试器,通过它一步,当代码不会做你希望它是什么注意。这将通过少量观察快速解决所有逻辑错误。即使您无法访问调试器,也可以使用print语句来打印各种变量的值,并在某些代码分支执行时进行比较,并与您预期的情况进行比较。

+1

他使用double for循环来比较每个元素与每个其他元素。 – corsiKa 2013-03-27 23:17:00

+1

@corsiKa他只检查列表中比当前节点更早的节点,以便正确计数重复节点的第一个实例并跳过所有其他节点。另外,它没有工作,因为它没有第二个节点,它通过列表前进,它只是比较节点和它的下一个节点。 – Patashu 2013-03-27 23:18:37

+0

@Patashu所以你建议我为我的j循环添加另一个节点? – pharaon450 2013-03-27 23:22:54

0

你周围的i循环您j循环第一次不执行任何操作(因为它从0开始,并继续同时j < i它不是),所以你离开distinct设置为true没有任何与任何比较。

尝试在1

+1

你误解了第二个循环的意思 - 它是为了看看这个节点在列表中是否有重复的EARLIER。你的建议会使每个节点都与自身比较,所以没有节点会被认为是非重复的。, – Patashu 2013-03-27 23:23:47

+0

@Patashu确切地说是 – pharaon450 2013-03-27 23:25:53

+0

你还是在第一次增加'nbDistinct'而不用与任何东西进行比较。 – OldCurmudgeon 2013-03-27 23:26:44

相关问题