2016-09-30 18 views
1

我正在嘗試標準面試問題,即以鏈表形式添加兩位數字並返回添加的答案。這裏是問題:無法在Java中分配LinkedList頭節點以供將來參考

給你兩個鏈表,代表兩個非負數。 這些數字以相反的順序存儲,並且它們的每個節點都包含一個數字,即 。添加這兩個數字並將其作爲鏈接列表返回。

輸入:(2 - > 4 - > 3)+(5 - > 6 - > 4)輸出:7 - > 0 - > 8

342 + 465 = 807 Make sure there are no trailing zeros in the output list So, 7 -> 0 -> 8 -> 0 is not a valid response even though 

值仍然807

現在,我正在編寫的代碼以ListNode數據類型的形式接受兩個參數,它是LinkedLists的起始節點。我不理解的是

  1. 如何維護列表的頭節點以供後面參考?
  2. 在Java中如何調用值和引用調用工作?我已經處理了C++中的指針和引用調用,但是我現在一直在嘗試使用Java中的東西,而且它非常不同。

    class ListNode { 
        public int val; 
        public ListNode next; 
        ListNode(int x) { 
         val = x; 
         next = null; 
        } 
    } 
    
    
    public class Solution { 
    
        public ListNode reverse(ListNode head) { 
         ListNode curr = head; 
         ListNode next = null; 
         ListNode prev = null; 
         while (curr != null) { 
          next = curr.next; 
          curr.next = prev; 
          prev = curr; 
          curr = next; 
         } 
         head = prev; 
         return head; 
        } 
    
    
        public ListNode addTwoNumbers(ListNode a, ListNode b) { 
         ListNode node = null; 
         ListNode head = null; 
         boolean carry = false; 
         while (a != null || b != null) { 
          int f = 0, s = 0; 
          if (carry) { 
           f++; 
          } 
          carry = false; 
          if (a != null) { 
           f += a.val; 
           a = a.next; 
          } 
          if (b != null) { 
           s = b.val; 
           b = b.next; 
          } 
          if (f + s > 9) { 
           carry = true; 
          } 
          int curr = (f + s) % 10; 
          node = new ListNode(curr); 
          if (head == null) { 
           head = node; 
          } 
          node = node.next; //warning that 'value of node assigned is never used' 
         } 
         if (carry) { 
          node = new ListNode(1); 
         } 
         printList(head); 
         return node; 
        } 
    } 
    
+0

「如何按值調用和引用工作Java調用」 Java是[調用 - 值(http://stackoverflow.com/questions/40480/is-java-pass-by-引用或傳遞值),總是。但是,在這種情況下,「價值」的含義是令人困惑的:被傳遞的變量的值,這可能是一個參考。所以,雖然引用的對象不是按值傳遞的,但引用該對象的變量是;這意味着你不能像在C++中那樣使用單獨的方法來交換值。 –

+0

@AndyTurner在Java中處理LinkedList問題的最佳方法是什麼?因爲在Java中保持頭部和其他值很痛苦,所以如果我簡單地執行'head = node',那麼head的值根據節點而改變,並且我不能在最後檢索頭值。如何避免這種情況? – tsaebeht

回答

1

node起着模糊的角色。

 node = new ListNode(curr); 
     node = node.next; // assigns null 

重命名nodeprevious做:

 int curr = (f + s) % 10; 
     ListNode newNode = new ListNode(curr); 
     if (head == null) { // Or `previous == null` 
      head = newNode; 
     } else { 
      previous.next = newNode; 
     } 
     previous = newNode; 

    ... 
    return head; 

處理head是使容器類LinkedList的私人領域的技術。

在java中,參數傳遞是按值調用的:f(a)永遠不會更改變量a:存儲對象指針/值的位置。而不是對象指針/值被壓入堆棧。 (對象值可能會更改其字段。)

因此,遞歸插入可能看起來像head = insert(head, ...)

在C上可以使用別名,不僅爲參數傳遞:

ListNode* head = NULL; 
ListNode** node = &head; 
shile (...) { 
    ... 
    *node = newNode; 
    node = &(newNode->next); 
} 
+0

'處理頭部的技巧是使它成爲一個容器類的私有字段LinkedList'這正是想到的。以前的方法似乎是一個很好的解決方法,這個問題,謝謝 – tsaebeht

+0

你的答案讓我失望。如果我在每個階段打印「head」和previous的值,我會得到相同的答案。看看這裏的代碼:http://ideone.com/N7dvLX – tsaebeht

+0

請編輯你的答案。這將是'int curr =(f + s)%10; ListNode newNode = new ListNode(curr); if(previous == null){ previous = newNode; head = newNode;其他{ previous.next = newNode; previous = previous.next; }' – tsaebeht

0

爲什麼這麼複雜?

public class Solution { 

    public ListNode addTwoNumbers(ListNode a, ListNode b) { 
     int firstNumber = nodeToNumber(a); 
     int secondNumber = nodeToNumber(b); 
     return numberToNode(firstNumber + secondNumber); 
    } 

    public int nodeToNumber(ListNode node) { 
     if (node.next != null) return node.value + 10 * nodeToNumber(node.next); 
     return node.value; 
    } 

    public ListNode numberToNode(int number) { 
     ListNode result = new ListNode(number % 10); 
     if (number > 10) result.next = numberToNode(number/10); 
     return result; 
    } 
}