Почему эта функция переименовывает узел LinkedList, переданный в качестве аргумента? - PullRequest
2 голосов
/ 01 мая 2019

Это из книги, которую я использую для изучения Java.

LinkedListNode, целое число -> LinkedListNode

Эта функция просто перебирает связанный список k раз и возвращает узел. У меня такой вопрос: есть ли смысл переименовывать параметр из «head» в «current»? Разве я не могу просто работать над головой напрямую?

LinkedListNode getKthNode(LinkedListNode head, int k) {
    LinkedListNode current = head;
    while (k > 0 && current != null) {
        current = current.next;
        k--;
    }
    return current;
}

Ответы [ 3 ]

2 голосов
/ 01 мая 2019

В этом случае присвоение head для current предназначено только для удобства чтения.

Метод будет вести себя точно так же, если вы измените локальную переменную head напрямую, вместо использования локальной переменной current.

Если, с другой стороны, ссылка head не была передана методу (т. Е. Она была бы получена из переменной экземпляра), то для вашего метода потребуется присвоить ее локальной переменной. не изменять head списка.

В таком случае LinkedListNode getKthNode(int k) будет методом класса LinkedList, который имеет LinkedListNode head переменную экземпляра.

0 голосов
/ 01 мая 2019

Абсолютно, вы можете переписать его следующим образом и ожидать тех же результатов:

LinkedListNode getKthNode(LinkedListNode head, int k) {
    while (k > 0 && head != null) {
        head = head.next;
        k--;
    }
    return head;
}

Вот пример некоторых тестов, которые я провел:

Сначала начал с создания класса LinkedListNode:

private static class LinkedListNode {
    public LinkedListNode next;
    private int value;

    public LinkedListNode(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

Затем я создал 3 LinkedListNode объектов, дав им значения 100, 200, 300.

public static void main(String[] args) {
    LinkedListNode first = new LinkedListNode(100);
    LinkedListNode second = new LinkedListNode(200);
    LinkedListNode third = new LinkedListNode(300);
    first.next = second;
    second.next = third;
    third.next = null;


    System.out.println(getKthNode(first, 1).getValue()); // 200
}

Если вы попробуете те же самые тесты, используя вашу оригинальную функцию, вы получитетот же ответ.Оно написано так, как будто оно пытается выразить.

0 голосов
/ 01 мая 2019

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

Он будет вести себя так же. Даже если вы используете голову напрямую.

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