当给定一个整数数组时,我试图用前面整数的乘积来更改每个元素。
例如,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。有什么建议吗??
编辑:所以我得到stackerflow或空指针异常的原因是因为我正在更新列表,然后试图得到下一个整数(但由于列表中只有两个元素,所以没有getNext()
)。我不知道该怎么解决。
看起来您有点被递归束缚住了。我修改了您的方法,以接受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
}
}
代码实际上有两个问题。
递归永远不会结束,也就是说,当递归再次调用同一节点时,它实际上并没有移动到更小的"子问题"再一次。
在创建一个新节点并修改下一个节点后,我们还需要在"下一个"节点之后连接该节点,否则链接将迷路的请检查以下解决这两个问题的方法。
虽然我没有做过多的测试,但它适用于简单的数据集。原始列表: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);
}
}
这是因为您在当前节点上调用递归方法,所以它实际上永远不会在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);
}
}