Java如何迭代地和递归地在链表中查找值

时间:2009-10-10 05:44:48

标签: java algorithm recursion linked-list iteration

我有一个方法,它引用了一个链表和一个int值。因此,此方法将计算并返回值在链接列表中发生的频率。所以,我决定上课,

public class ListNode{ 
 public ListNode (int v, ListNode n) {value = v; next = n;)
 public int value;
 public ListNode next;
}

然后,该方法将以

开头
public static int findValue(ListNode x, int valueToCount){
 // so would I do it like this?? I don't know how to find the value, 
 // like do I check it?
  for (int i =0; i< x.length ;i++){
    valueToCount += valueToCount; 
  }

所以,我改变了这一部分,如果我递归地做了这个,那么我会有

public static int findValue(ListNode x, int valueToCount) {
  if (x.next != null && x.value == valueToCount {
     return 1 + findValue(x, valueToCount);}  
  else 
   return new findvalue(x, valueToCount);

那么,递归部分现在是正确的吗?

4 个答案:

答案 0 :(得分:1)

您需要以某种方式知道列表的结束位置。让我们假设(因为这是最简单的方法),最后一个节点将next设置为null。然后,您将使用此作为检查何时停止迭代:

public static int findValue(ListNode x, int valueToCount) {
    ListNode currentNode = x;
    int count = 0;
    while (currentNode.next!=null) {
      if (currentNode.value == valueToCount) {
        count++;
      }
      currentNode = currentNode.next;
    }
    return count;
}

同样的方法可以用于递归解决方案,除了它有点麻烦,因为你需要将count作为参数传递给你的递归函数调用。

答案 1 :(得分:1)

这看起来像示例代码中的错误:

return findValue(x, valueToCount +1);

您应该递增计数,而不是要搜索的值。另外不要忘记移动到下一个节点!所以这应该是:

return 1 + findValue(x.next, valueToCount);

答案 2 :(得分:1)

Little Lisper路径:

  1. null的结果是什么 - null

  2. 什么是正常节点的查找结果 -

    if (node.value == aValue)
        return true;
    

    如果找到

  3. 否则以递归方式尝试下一个节点

    public boolean find(ListNode<T> n, T value)
    {
      if (n==null)
       return false;
      if (n.element.equals(value))
         return true;
      else 
        return find(n.next, value);
    }
    

答案 3 :(得分:0)

为了帮助您入门,您会发现如果您使用非空findValue运行ListNode方法,则会触发无限循环。您需要在每次递归时将节点移动到next