爪哇双向链表 - 两个相邻节点
的公共方法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。
你说得对,循环终止不准确权。 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()是完美的!从来不想过度遍历列表...希望这有助于!
太棒了,所以基本上hasNext()检查currentNode是否有下一个节点?是否有区别于使用:while(currentNode.next!= null){?? – KimCheeFatChoyProgrammer 2014-12-08 04:51:52
小心,这将在空列表中崩溃,并且我发现使用if(x)action1 else if(!x)action2;'被......,折磨(对不起,试着要委婉)。有很多更清晰的方式来表达你想要做的事情。 – paxdiablo 2014-12-08 05:02:34
那么,列表迭代器下一个没有可变成员,但他们确实有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
你没有向我们展示'hasNext()'的实现。我们应该如何知道它是否正确?另外,“data”是什么类型?除非它是一个原始的,否则你的平等检查将会失败。(并且我认为它不是,因为你提到了一个可能是'null'的机会)。 – azurefrog 2014-12-08 04:36:07
你的代码不能像这样编译。编译器应该抱怨缺少返回值。 – nhahtdh 2014-12-08 04:37:17
谢谢nhahtdh,生病得到修复 – KimCheeFatChoyProgrammer 2014-12-08 04:57:28