2015-10-17 1 views
1

Я хочу проверить свою программу и протестировать ее. Я просто конвертирую целые числа одного ListNode в String и объединяю эти преобразования. Например, если у меня есть:Почему код показывает только `1 2`?

ListNode object1; 
object1 = new ListNode(2); 
object1 = new ListNode(4); 
object1 = new ListNode(3); 

выход из addTwoNumbers() должен быть «243» (Цель метода отличается, я просто хочу, чтобы проверить его), но это дает мне «1 2» , И Eclipse также не будет запускать отладчик в этой программе и не знает, почему.

public class ListNode { 
    int val; 
    ListNode next; 
    ListNode(int x) { 
     val = x; 
    } 

public String addTwoNumbers(ListNode l1, ListNode l2) { 
    String l1Digits = ""; 
    String l2Digits = ""; 

    while(l1 != null) { 
     l1Digits += Integer.toString(l1.val) + ""; 
     l1 = l1.next; 
    } 

    while(l2 != null) { 
     l2Digits += Integer.toString(l2.val) + ""; 
     l2 = l2.next; 
    } 
    return l1Digits; 
} 


class Tester { 

    public void main(String[] args) { 
    ListNode object1; 
    object1 = new ListNode(2); 
    object1 = new ListNode(4); 
    object1 = new ListNode(3); 

    ListNode object2; 
    object2 = new ListNode(5); 
    object2 = new ListNode(6); 
    object2 = new ListNode(4); 

    System.out.println(addTwoNumbers(object1, object2)); 

    } 
    } 
} 

ответ

1

Вместо этого:

ListNode object1; 
object1 = new ListNode(2); 
object1 = new ListNode(4); 
object1 = new ListNode(3); 

ListNode object2; 
object2 = new ListNode(5); 
object2 = new ListNode(6); 
object2 = new ListNode(4); 

Кажется, что вы на самом деле имел в виду следующее:

ListNode object1; 
object1 = new ListNode(2); 
object1.next = new ListNode(4); 
object1.next.next = new ListNode(3); 

ListNode object2; 
object2 = new ListNode(5); 
object2.next = new ListNode(6); 
object2.next.next = new ListNode(4); 

В исходном коде, вы перезаписать значение object1 и object2. Это эквивалентно исходному коду и, конечно, не то, что вы хотите:

ListNode object1 = new ListNode(3); 
ListNode object2 = new ListNode(4); 

Для создания более длинных списков, это может стать утомительным. Вы можете создать вспомогательный метод, чтобы сделать это проще, например:

ListNode createList(int...values) { 
    if (values.length == 0) { 
     return null; 
    } 
    ListNode head = new ListNode(values[0]); 
    ListNode node = head; 
    for (int i = 1; i < values.length; ++i) { 
     node.next = new ListNode(values[i]); 
     node = node.next; 
    } 
    return head; 
} 

Это позволит заменить первый код на вершине с этим:

ListNode object1 = createList(2, 4, 3); 
ListNode object2 = createList(5, 6, 4); 

Btw есть другие вопросы тоже в вашей программе. В addTwoNumbers вы назначаете l2Digits, но никогда не обращаетесь к нему. Кажется совершенно неиспользованным и бессмысленным. Метод просто объединяет значения в первом списке и возвращает его, , поэтому он не делает ничего, что предлагает его имя.

+0

Что делать, если у меня есть большее число, как мне запустить цикл? @janos –

+0

Все еще давая '1 2' даже после того, как вы изменили свое предложение, @janos –

+0

Ваш оригинальный код печатает' 3'. После изменений я предложил напечатать '243'. – janos

0

Каждый раз, когда вы назначаете новое значение object1, вы неявно удаляете все ранее назначенные. Вы должны добавить узлы в обратную сторону к LinkNode, назначив поле next.

В списке ListNode должен быть такой метод, как addToTail.

public class ListNode { 

    // ... all the fields and methods you already have 

    public void addToTail(ListNode newNode) { 
     if (this == null) { 
      this = newNode; 
      return; 
     } 
     ListNode tmp = this; 
     // traverse to the tail node 
     while(tmp.next) { tmp = tmp.next; } 
     tmp.next = newNode; 
     return; 
    } 
} 

ListNode object1; 
object1.addToTail(new ListNode(2)); // (2) 
object1.addToTail(new ListNode(4)); // (2) -> (4) 
object1.addToTail(new ListNode(3)); // (2) -> (4) -> (3) .. and so on