多个节点链接列表的内容

时间:2016-02-28 11:29:00

标签: java recursion linked-list

我有一个编程挑战,就是递归地将多个数据放在它后面的列表的节点中。例如

  

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());
          }
        }
      }

3 个答案:

答案 0 :(得分:1)

您正在调用head.getNext()next.getData(),而不检查headnext中的任何一个是否为空,因此在处理最后一个节点时程序将崩溃。即便如此,您只会将两个连续项目相乘而不会累积产品。

您可以使用函数的返回值来累积正确的答案:

    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);
  }
}