Связанный список содержит ТОЛЬКО указатель на узел, который должен быть удален в единственном Связанном списке (удалить разницу кодов)? - PullRequest
0 голосов
/ 19 ноября 2018

После того, как я сделал свои TODO
Я знаю, что решение выглядит следующим образом

public void deleteNode(Node node) { 
    node.data = (node.next).data; 
    node.next = (node.next).next; 

    System.gc(); 
} 

Но мой вопрос в том, что

Чем выше решение отличается от другого
оба являются действительными решениями и имеют одинаковую функциональность или нет

public void deleteNode(Node node) { 
    node = (node.next); 

    System.gc(); 
}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Благодаря @ talex

И я визуализирую случаи, чтобы быть более ясными
Давайте предположим, что проблема удаления следующих node c из Связанного списка
И у нас есть ТОЛЬКО доступк этому узлу
enter image description here

Первое решение фактически удалит узел

public void deleteNode(Node node) { 
    node.data = (node.next).data; 
    node.next = (node.next).next; 

    System.gc(); 
} 

При копировании в следующую ячейку(значение и указатель) на ячейку параметра
Таким образом, конечный результат
Ячейка параметра будет считаться удаленной, а Связанный список будет правильно соединен в цепочку
Подсказки:

  • Нет проблем, чтоnode d не используется ни одним указателем, GC очистит
  • Это решение НЕ будет работать, если нам нужно удалить последнюю ячейку

enter image description here

Второе решение НЕ удалит узел

public void deleteNode(Node node) { 
    node = (node.next); 

    System.gc(); 
}

Это потому, что ТОЛЬКО изменится только указатель на ячейку параметра
Таким образом, конечный результат
Параметрячейка НЕ ​​будет удалена, а в связанном списке все еще будет ячейка enter image description here

0 голосов
/ 19 ноября 2018

Когда вы делаете

node = (node.next); 

Вы меняете параметр, но не меняете никаких данных.

Подход с использованием вызова по значению в Java (немного трудно понять, что значит передавать ссылку по значению).

Вот небольшой пример:

void foo(int i) {
    i = 2;
    System.out.println(i);
} 

когда мы называем это

int j = 1;
foo(j);
System.out.println(j);

мы получаем 2 и 1 на консоли. Это означает, что когда foo вызывается копия переданного ему значения.

PS:

Вам не нужно звонить System.gc();.

...