2016-03-04 101 views
0

我在尝试将节点添加到已初始化为null的链接列表时出现问题。在我的方法中,我设置了一个测试用例来检查节点是否最初是空的,如果是,它会创建一个新的节点,并且传入的值是这个节点。但是,无论出于何种原因,除非节点已经传递了至少一个元素在检查出来:将节点添加到初始空链接列表

Node addNode(Node node, int val) 
    { 
     if(node == null) 
      { 
       Node newNode = new Node(val); 
       //node = newNode; 
       return newNode; 
      } 
     node.next = addNode(node.next, val); 
     return node; 
    } 

//Driver Class 
    Scanner in = new Scanner(System.in); 
    Node myNode = new Node(1); 
    int numEntries = in.nextInt(); 
    for(int i = 0 ; i < numEntries ; i++) 
    { 
     int inputVal = in.nextInt(); 
     myNode.addNode(myNode, inputVal); 
    } 

如果MYNODE被初始化为空值,上面的代码将无法运行(节点MYNODE = NULL;)

全码:

/* package whatever; // don't place package name! */ 

    import java.util.*; 
    import java.lang.*; 
    import java.io.*; 




/* Name of the class has to be "Main" only if the class is public. */ 
    class Ideone 
    { 
    public static class Node 
    { 
     private int value; 
     Node next; 
     public Node() 
     { 
      next = null; 
     } 
     public Node(int val) 
     { 
      value = val; 
      next = null; 
     } 
     Node addNode(Node node, int val) 
     { 
      if(node == null) 
       { 
        Node newNode = new Node(val); 
        //node = newNode; 
        return newNode; 
       } 
      node.next = addNode(node.next, val); 
      return node; 
     } 
    } 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     Scanner in = new Scanner(System.in); 
     Node myNode = new Node(1); 
     Node current = null; 
     Node oddFirst = new Node(1); 
     int numEntries = in.nextInt(); 
     for(int i = 0 ; i < numEntries ; i++) 
     { 
      int inputVal = in.nextInt(); 
      myNode.addNode(myNode, inputVal); 
     } 
     current = myNode; 
     while(current != null) // Check if values were copied correctly 
     { 
      if(oddFirst == null) 
      { 
       oddFirst = new Node(current.value); 
      } 
      oddFirst.addNode(oddFirst,current.value); 
      //oddFirst = current.next; 
      //oddFirst = oddFirst.next; 
      current = current.next.next; 
     } 
     while(oddFirst != null) 
     { 
      System.out.println("Current Value: " + oddFirst.value); 
      oddFirst = oddFirst.next; 
     } 
    } 
} 
+0

你是说你试图将myNode初始化为null,然后在for循环中调用'myNode.addNode()'吗? – gla3dr

+0

@ gla3dr是的,这就是我说的。 –

+0

为什么不使用java.util.LinkedList?并简单地做list.add(新节点(inputVal)); 您是否有特殊的需求,不允许标准库中已有的链表实现? – reegnz

回答

1

一个链表的简单解决方案:

class Node { 
    int val; 
    Node next; 
} 

public class LinkedList { 
    public Node first; 
    public Node last; 
    public void addNext(int val) { 
     Node node = new Node(); 
     node.val = val; 
     if(last == null) { 
      first = last = node; 
     } 
     else { 
      last.next = node; 
      last = node; 
     } 
    } 
} 

与原代码的主要问题是,它不与空单的情况下,关注自身。 您无法辨别列表中包含单个1值和空列表的情况。

+0

@MannyO实际上,解决方案是java.util.LinkedList解决方案的简化版本。你应该真的阅读代码。编程主要是关于阅读源代码,而不是编写它。 – reegnz

+0

是的,我认为病了阅读源代码,并尝试更好地了解它。谢啦 –

0

因为你'不处理addNode()的返回值。

你在下面的函数返回一个节点:

Node addNode(Node node, int val) 

但你不是在这里办理退换货:

myNode.addNode(myNode, inputVal); 

这应该可以帮助你找出解决方案。

+0

嗯,你是什么意思? –

+0

看看addNode()。你正在返回一个“节点”。你在哪里处理那个返回值? – attaboy182

+0

这与它无关。主要问题是空值。即使你处理了返回值,你也必须从他的解决方案中开始。 – reegnz