Как переменная работа? Я запутался в коде java из leetcode - PullRequest
0 голосов
/ 11 июля 2020
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode p = l1, q =l2;
    int carry = 0;
    ListNode result = new ListNode(0);
    ListNode temp = result;
    
    while (p != null || q != null) {
        int x = p == null ? 0 : p.val;
        int y = q == null ? 0 : q.val;
        int sum = x + y + carry;
        carry = sum/10;
        int node = sum % 10;
        temp.next = new ListNode(node);
        p = (p != null && p.next != null) ? p.next : null;
        q = (q != null && q.next != null) ? q.next : null;
        temp = temp.next;
    }
    
    if(carry != 0)
    {
        temp.next = new ListNode(carry);
    }
    
    return result.next;
}

Мой вопрос о переменной temp и result. На мой взгляд, temp и result - это два разных объекта с одинаковым начальным значением, и результат не должен изменяться, поскольку temp изменен в while l oop. Благодарю за любое предложение

Ответы [ 2 ]

1 голос
/ 11 июля 2020

В Java, когда вы назначаете переменную одного типа другой переменной того же типа, как вы делали с ListNode temp = result;, java автоматически делает переменную temp ссылочным типом. Это означает, что копирование не происходит, и переменная temp указывает на тот же самый объект и тот же адрес памяти, что и переменная result. Это означает, что при изменении переменной temp такое же изменение применяется к объекту result, потому что на самом деле это один и тот же объект.

1 голос
/ 11 июля 2020

Когда вы создали ListNode result = new ListNode(0);, создается новый объект, а переменная result является ссылкой на объект. Оператор ListNode temp = result; приводит к присвоению объектной ссылки результата переменной temp. Поскольку обе переменные указывают на один и тот же объект, изменение одной приводит к изменению другого.

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