【问题标题】:Java How to find a value in a linked list iteratively and recursivelyJava如何迭代和递归地在链表中查找值
【发布时间】:2010-12-05 13:15:44
【问题描述】:

我有一个引用链接列表和 int 值的方法。因此,此方法将计算并返回该值在链表中出现的频率。所以,我决定开一堂课,

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

然后,该方法将以 a 开头

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);

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

【问题讨论】:

  • ...而您的问题是“这行得通吗?”?
  • 是的,我想知道这是否可行

标签: java algorithm recursion linked-list iteration


【解决方案1】:

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

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 作为参数传递给递归函数调用。

【讨论】:

  • 您可以在您的签名中添加另一个int,将您的while 设为if 并将currentNode=currentNode.next; 更改为return findValue(x,valueToCount,count);
  • @Jacky,上面的例子在if/else语句中有计数器,上面的注释给了你采用递归方法的线索。
  • 好的,谢谢你的提示,这真的帮助我了解更多:)
【解决方案2】:

这看起来像是您的示例代码中的一个错误:

return findValue(x, valueToCount +1);

您应该增加计数,而不是正在搜索的值。也不要忘记移动到下一个节点!所以应该是:

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

【讨论】:

  • Java 没有尾调用消除功能,因此将计数作为额外的累加器参数传递几乎没有意义。
  • 好的,我现在明白了,但是 if 语句呢。我认为它错了对吗?应该是 if(x.next == null && x.value != valueToCount) { return 0; } 这样对吗?
  • @Pete,valueToCount 是要搜索的值,而不是累加器。
  • @Jacky, if(x.next == null...) 将错过第一个节点,并且不会在空列表上工作。
【解决方案3】:

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);
    }
    

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多