2016-03-04 96 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