#java #recursion
Вопрос:
Я пытался рекурсивно изменить список ссылок в java. Я разработал решение на бумаге, но когда я пытаюсь реализовать его в коде, оно продолжает терпеть неудачу. Может кто-нибудь взглянуть на мой код и сказать мне, чего мне здесь не хватает?
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Resu<
import org.junit.runner.notification.Failure;
import static org.junit.Assert.*;
public class Solution {
public static class LinkedListNode {
public int value;
public LinkedListNode next;
public LinkedListNode(int value) {
this.value = value;
}
}
public static LinkedListNode reverse(LinkedListNode headOfList) {
LinkedListNode newHead = headOfList;
LinkedListNode nextNode = headOfList.next;
if (headOfList == null) {
return null;
}
if (headOfList.next == null) {
return headOfList;
}
else {
reverseNodes(newHead, headOfList, nextNode);
headOfList.next = null;
}
return newHead;
}
public static void reverseNodes(LinkedListNode head, LinkedListNode a1, LinkedListNode a2) {
if(a2.next == null) {
a2.next = a1;
head = a2;
}
else {
LinkedListNode nextNode = a2.next;
reverseNodes(head, a2, nextNode);
a2.next = a1;
}
}
Ответ №1:
Вы вызываете функцию headOfList.next
, даже не проверив, является ли headOfList
она нулевой
if (headOfList == null) {
return null;
}
это должно стоять прямо в верхней части вашей reverse
функции
Здесь вы пытаетесь установить значение head, но это влияет только на параметр метода, который вы не можете перезаписать значением указателя.
public static void reverseNodes(LinkedListNode head, LinkedListNode a1, LinkedListNode a2) {
if(a2.next == null) {
a2.next = a1;
//Strange assignment has no sence
head = a2;
}
else {
LinkedListNode nextNode = a2.next;
reverseNodes(head, a2, nextNode);
a2.next = a1;
}
}
Пример для вас:
public static void main(String[] args) {
String x = "12345";
System.out.println("outside of method x = " x);
changeVariable(x);
System.out.println("outside of method x = " x);
}
public static void changeVariable(String variable){
variable = "hello";
System.out.println("inside of method x = " variable);
}
Приведет к:
outside of method x = 12345
inside of method x = hello
outside of method x = 12345
Комментарии:
1. Можете ли вы объяснить, что вы подразумеваете под «Здесь вы пытаетесь установить значение head, но это влияет только на параметр метода, который вы не можете перезаписать значением указателя». Я предположил, что, поскольку это ссылки, ссылка на заголовок изменится только в том случае, если мы перейдем к хвосту, и нам не нужно ничего возвращать.
2. Я имею в виду, что установка переменной head не имеет никакого эффекта, потому что это изменяет только ссылку в вашей функции
3. Я добавил пример
4. @srachoor, чтобы уведомить вас