2016-09-30 12 views
1

私はリンクリストの形で2桁を追加し、追加された答えを返す標準的なインタビューの質問をしています。将来の参照のためにJavaでLinkedListのヘッドノードを割り当てることができません

2つの非負の数値を表す2つのリンクされたリストが与えられます。 数字は逆順で格納され、ノードのそれぞれには の1桁が含まれます。 2つの数値を加算し、リンクされたリストとして返します。

入力:(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

あります

私が書いているコードでは、LinkedListsの開始ノードであるListNodeというデータ型の形式で2つの引数を取ります。私が理解していないのは

  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は[call-by-value]です(http://stackoverflow.com/questions/40480/is-java-pass-by-値の参照または渡し)は、常にです。しかし、この文脈における "価値"の意味は混乱しています。渡される変数の値です。これは参考になります。したがって、参照されたオブジェクトが値渡されていない場合、そのオブジェクトを参照する変数は次のようになります。つまり、C++のように別のメソッドで値を入れ替えるようなことはできません。 –

+0

@AndyTurnerこのようなLinkedListの質問をJavaで処理する最良の方法は何でしょうか?Javaでは、単にhead = node'を実行すると、headの値がnodeに応じて変化し、私は最後に頭の値を取り出すことができないため、頭や他の値を痛みの中で維持します。これを避ける方法は? – tsaebeht

答えて

1

nodeあいまいな役割を果たしています。

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

previousnodeの名前を変更して行います。headを処理する

 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; 

技術はコンテナクラス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 =新しいListNode(curr); if(previous == null){ previous = newNode; head = newNode; } else { 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; 
    } 
} 
関連する問題