我有一个编程挑战,那就是递归地多重数据后面的列表节点。例如
2 - 4 - 6 - 8
将是
384 - 192- 48 - 8
这就是我到目前为止在 void 产品方法中所做的。我不断收到空指针异常。我的产品方法有什么问题
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());
}
}
}
您正在调用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;
}
}
检查整个代码的逻辑,但首先想到的是你分配:
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)
。
首先,在head
上调用getNext()
方法,然后检查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);
}
}