链表的递归

时间:2015-06-23 01:33:14

标签: java recursion nullpointerexception linked-list

当给出一个整数数组时,我试图用它前面的整数乘积来改变每个元素。

例如,int[] array = {2,2,3,4};现在是:{2, 4, 12, 48};

我将每个元素添加到LinkedList,我试图以递归方式执行此操作。

这就是我所拥有的:

Node curr = list.getFirst();
product(curr);

public static void product(Node curr)
{
    if(curr == null)
    {
        return;
    }
    else
    {
        int data = curr.getData() * curr.getNext().getData();
        Node newNode = new Node(data);
        curr.setNext(newNode);

        //  product(curr);
    }
}

第一个产品工作:{2,4},但是当我尝试输入递归时,我得到一个stackoverflow。有什么建议??

编辑:所以我要么得到 stackoverflow 空指针异常是因为我正在更新列表,然后尝试获取下一个整数(但由于列表中只有两个元素,因此没有getNext())。我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

看起来你在递归中有点紧张。我修改了您的方法以接受Node以及上一次迭代中的产品。在迭代的每一步,我都会更新已存在的List中的值,因此无需使用new运算符。

public static void product(Node curr, int value) {
    if (curr == null) {
        return;
    }
    else {
        int data = value * curr.getData();  // compute current product
        curr.setData(data);                 // update Node
        product(curr.getNext(), data);      // make recursive call
    }
}

答案 1 :(得分:0)

这是因为你在当前节点上调用递归方法,所以它实际上永远不会在LinkedList中向前移动。您可以简单地更新下一个节点的数据并在其上调用递归方法。请参阅以下代码:

Node curr = list.getFirst();
product(curr);

public static void product(Node curr)
{
    Node next  = curr.getNext();   
    if(next == null)
    {
        return;
    }
    else
    {
        int data = curr.getData() * next.getData();
        next.setData(data);
        product(next);
    }
}

答案 2 :(得分:0)

代码实际上有两个问题。

  
      
  1. 递归永远不会结束,即它实际上并没有移动到较小的“子问题”,因为递归再次调用同一个节点   再一次。

  2.   
  3. 创建新节点并修改下一个节点后,我们还需要在下一个节点“之后”连接节点,否则链接将是   丢失。请检查以下方法,以解决这两个问题。

  4.   

虽然我没有做过多的测试,但它适用于简单的数据集。 原始清单: 2→4-将5-> 6-> 8->空 乘以列表: 2→8-> 40-> 240-> 1920->空

public void product(Node curr) {
    if (curr.getNext() == null) {
        return;
    } else {
        int data = curr.getData() * curr.getNext().getData();
        Node newNode = new Node();
        newNode.setData(data);
        Node nodeAfterNextNode = curr.getNext().getNext();
        newNode.setNext(nodeAfterNextNode);
        curr.setNext(newNode);

        product(newNode);
    }
}