爪哇双向链表 - 两个相邻节点

问题描述:

的公共方法twoTogether()为MYLIST返回True,当且仅当该列表具有相等的两个相邻元素的类的平等。您可以假定没有列表元素(数据)为空。以下是一些示例:列表[a,b,c,d]在调用此方法时将返回false。但列表[a,b,b,c]或[a,b,c,d,e,f,f]。该方法返回true。写公共方法twoTogether。您可以使用List接口引用(领域:数据,上一个,下一个)(头,尾)(尺寸)等。这里是我写的代码:爪哇双向链表 - 两个相邻节点

public boolean twoTogether(){ 
     currentNode = head; 
     while (currentNode.hasNext()){ 
      if (currentNode.data != currentNode.next.data){ 
        currentNode = currentNode.next; 
      } 
      else if (currentNode.data == currentNode.next.data){ 
       return True; 
      } 
     } 
     return False; 
    } 

这是否正确的代码用于遍历一个列表测试两个节点之间的平等?我是否也正确实施了hasNext()?我很难找出如何不终止循环,或者为嵌套的if返回true,然后为else语句返回false。

+2

你没有向我们展示'hasNext()'的实现。我们应该如何知道它是否正确?另外,“data”是什么类型?除非它是一个原始的,否则你的平等检查将会失败。(并且我认为它不是,因为你提到了一个可能是'null'的机会)。 – azurefrog 2014-12-08 04:36:07

+0

你的代码不能像这样编译。编译器应该抱怨缺少返回值。 – nhahtdh 2014-12-08 04:37:17

+0

谢谢nhahtdh,生病得到修复 – KimCheeFatChoyProgrammer 2014-12-08 04:57:28

你说得对,循环终止不准确。 while循环中的前两个分支不属于。前两个分支中的一个将始终开火,因为!=和==是补充。返回false语句属于while循环的外部,表示整个列表已遍历并且没有相等的相邻节点。

public boolean twoTogether(){ 
    currentNode = head; 
    while (currentNode.hasNext()){ 
     if (currentNode.data != currentNode.next.data){ 
      currentNode = currentNode.next; 
     } 
     else if (currentNode.data == currentNode.next.data){ 
      return True; 
     } 
    } 
    return False; 
} 

使用hasNext()是完美的!从来不想过度遍历列表...希望这有助于!

+0

太棒了,所以基本上hasNext()检查currentNode是否有下一个节点?是否有区别于使用:while(currentNode.next!= null){?? – KimCheeFatChoyProgrammer 2014-12-08 04:51:52

+0

小心,这将在空列表中崩溃,并且我发现使用if(x)action1 else if(!x)action2;'被......,折磨(对不起,试着要委婉)。有很多更清晰的方式来表达你想要做的事情。 – paxdiablo 2014-12-08 05:02:34

+0

那么,列表迭代器下一个没有可变成员,但他们确实有next()函数。它返回下一个节点(如果没有一个,则返回NULL)并推进迭代器。这意味着您需要消除第一个分支中的节点升级。 – Freestyle076 2014-12-08 05:08:48

的基本思路如下:

  • 步骤一,检查列表是空的。如果是这种情况,则根据定义,不能有重复,因此请返回false并停止。

    这可以防止您在当前不存在的情况下尝试评估以下元素)。

    否则,启动与当前元素是在列表中第一

  • 第二步,你需要花费很长时间进行,因为当前元素(因为要核对下一电流)以下的至少一个。

    如果没有下一个元素,那么你已经完成了名单,发现没有重复,所以立即返回false(因此停止)。

  • 第三步,你现在知道有两个电流和下一个,所以实际上检查目前对下。

    如果他们的数据是相同的,你发现了一个重复,并可以立即返回true(因此停止)。

  • 第四步,有一个在点没有重复,但有可能是一个进一步的,所以前进到下一个元素,并返回到第二步以上再次检查您是否已经走到了尽头。

伪代码,这将是(在head传递作为参数):

def twoTogether (node): 
    if node == null:      # empty means no dupes possible 
     return false 

    while node.next != null:    # loop through list 
     if node.data == node.next.data: # check current against next 
      return true 
     node = node.next     # advance to next 

    return false       # no dupes before list end