我有一个编程挑战,就是递归地将多个数据放在它后面的列表的节点中。例如
2 - 4 - 6 - 8
将是
384 - 192 - 48 - 8
这是我迄今为止在void product方法中所做的。我一直得到一个空指针异常。我的产品方法有什么问题
class Node
{
private int data;
private Node next;
private Node prev;
public Node(int newData,Node newNext,Node newPrev)
{
data = newData;
next = newNext;
prev = newPrev;
}
public int getData()
{
return data;
}
public void setData(int otherData)
{
this.data = otherData;
}
public Node getNext()
{
return next;
}
public Node getPrev()
{ return prev;
}
public void setNext(Node newNext)
{
next = newNext;
}
public void setPrev(Node newPrev)
{
prev = newPrev;
}
}
class LinkedList
{
private Node head;
private Node start;
private Node end;
public LinkedList()
{
head = null;
start = null;
end = null;
}
public void insert(int data)
{
Node newNode = new Node(data,null,null);
if(start == null)
{
start = newNode;
end = start;
}
else
{
newNode.setPrev(end);
end.setNext(newNode);
end = newNode;
}
}
public void product()
{
product(head);
}
public void product(Node head)
{
Node next = head.getNext();
if(head == null)
{
return;
}
else
{
int data = head.getData() * next.getData();
head.setData(data);
product(head.getNext());
}
}
}
答案 0 :(得分:1)
您正在调用head.getNext()
和next.getData()
,而不检查head
或next
中的任何一个是否为空,因此在处理最后一个节点时程序将崩溃。即便如此,您只会将两个连续项目相乘而不会累积产品。
您可以使用函数的返回值来累积正确的答案:
public void product()
{
product(head);
}
public int product(Node head)
{
if(head == null)
{
return 1;
}
else
{
int data = head.getData() * product(head.getNext());
head.setData(data);
return data;
}
}
答案 1 :(得分:0)
我没有检查整个代码的逻辑,但首先想到的是你分配:
Node next = head.getNext();
然后你检查if(head == null)
但是if(next == null)
呢?
如果是,那么你就错了:
next.getData()
由于head
可以是非null
,但其next
肯定可以是null
。
正确行动方案是首先检查if(head == null)
,然后分配Node next = head.getNext();
,然后检查if(next == null)
。
答案 2 :(得分:0)
首先,您在getNext()
和然后上调用head
方法,检查head
是否为null
?这显然是错误的。
您应首先检查head
是否为null
。然后,您应该检查next
是否为null
。
此外,我不认为您的递归会正确计算产品,因为您将current
头部中的数据与当前next
中的数据相乘 - 您可以实现该目标用一个简单的循环。
相反,您应首先致电product(next)
,稍后再计算产品 。像这样(虽然没有测试)
public void product(Node head)
{
if (head == null)
return;
Node next = head.getNext();
product(next);
if (next != null)
{
int data = head.getData() * next.getData();
head.setData(data);
}
}