当给出一个整数数组时,我试图用它前面的整数乘积来改变每个元素。
例如,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()
)。我不知道如何解决这个问题。
答案 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)
代码实际上有两个问题。
递归永远不会结束,即它实际上并没有移动到较小的“子问题”,因为递归再次调用同一个节点 再一次。
- 醇>
创建新节点并修改下一个节点后,我们还需要在下一个节点“之后”连接节点,否则链接将是 丢失。请检查以下方法,以解决这两个问题。
虽然我没有做过多的测试,但它适用于简单的数据集。 原始清单: 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);
}
}