Java双向链表 - 两个相邻节点的相等性

时间:2014-12-08 04:34:27

标签: java list traversal doubly-linked-list

类MyList的公共方法twoTogether()返回True,当且仅当列表具有两个相等的相邻元素时。您可以假设没有列表元素(数据)为空。以下是一些示例:列表[a,b,c,d]在调用此方法时将返回false。但是列表[a,b,b,c]或[a,b,c,d,e,f,f]。该方法返回true。把公共方法写成两个。您可以使用List接口引用(字段:data,prev,next)(head,tail)(size)等。这是我编写的代码:

 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 个答案:

答案 0 :(得分:2)

你是对的,循环终止不是完全正确。 while循环中的前两个分支不属于。前两个分支之一将始终触发,因为!=和==是补充。 return 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()是完美的!永远不想过度遍历列表...希望这有帮助!

答案 1 :(得分:1)

基本思路如下:

  • 第一步,检查列表是否为空。如果是这种情况那么,根据定义,可能没有重复,所以返回false并停止。

    这可以防止您在当前时尝试评估以下元素一个不存在。)
    否则,从列表中的当前元素 first 开始。

  • 第二步,只要在当前元素后面至少有一个元素(因为你想要检查下一个电流),你需要继续进行。

    如果有< em> no 以下元素然后您已完成列表并且未找到重复项,因此立即返回false(因此停止)。

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

    如果他们的数据是相同的,你&#39 ;我发现了一个副本,您可以立即返回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