2016-05-28 3 views
0

Я пытаюсь изменить LinkedList с помощью рекурсивных вызовов, пожалуйста, дайте мне знать, где я ошибаюсь, я не могу поймать обратную голову LL. LLNode - это узел связанного списка, а ReverseLLRecursively.reverse - это функция, которую я написал для реверсирования.Рекурсивно реверсивный связанный список

Вот мой код:

public class LLNode { 
    private int data; 
    private LLNode next; 

    public LLNode(int data, LLNode next) { 
     this.data = data; 
     this.next = next; 
    } 

    public int getData() { 
     return data; 
    } 

    public void setData(int data) { 
     this.data = data; 
    } 

    public LLNode getNext() { 
     return next; 
    } 

    public void setNext(LLNode next) { 
     this.next = next; 
    } 

    @Override 
    public String toString() { 
     return data + "->[" + (next!=null?next.data:"") + "]"; 
    } 
} 

public class ReverseLLRecursively { 

    public static LLNode newHead = new LLNode(-1, null); 

    public static LLNode reverse(LLNode head, LLNode newHead) { 
     if(head==null || head.getNext()==null) { 
      newHead = head; 
      return head; 
     } 

     LLNode node = reverse(head.getNext(), newHead); 
     node.setNext(head); 
     head.setNext(null); 
     return node.getNext(); 
    } 

    public static void main(String[] args) { 
     LLNode ll = new LLNode(1,new LLNode(2, new LLNode(3, new LLNode(3, new LLNode(2, new LLNode(3, null)))))); 

     reverse(ll , newHead); 
     System.out.println(newHead); 

    } 

} 
+0

Я знаю, что в Интернете имеются готовые решения для реверсирования LL. Но это не поможет мне понять, где я ошибся в рекурсии. – user2725673

+0

Вы пытаетесь сделать много вещей и в итоге все делаете неправильно. У вас есть 2 механизма. Оба не работают. Вам просто нужно 1, что является returnValue обратного (11); У меня статическая и нестатическая версия в моем ответе, сравните их с вашими и посмотрите на разницу (хотя моя версия несколько понятна, потому что это правильно имена). Также научитесь правильно называть вещи, все ваши имена и переменные подвергаются насилию и вы не понимаете свой собственный код. – HopefullyHelpful

+0

просто переименуйте переменную метода: public static LLNode reverse (LLNode head, LLNode ** newHead **), а затем узел LLNode = reverse (head.getNext(), ** newHead **); Это сработает. –

ответ

1

Вы усложнять вашу проблему и работать с локальной переменной, которая имеет такое же имя, как статический член. Это должно быть проще:

public static LLNode reverse(LLNode previous) { 
    if(previous==null) { 
     return null; 
    } 
    LLNode toReturn = (previous->getNext() == null) ? previous : reverse(previous.getNext()); 
    previous.getNext().setNext(previous); 
    return toReturn; 
} 

Обратите внимание, что toReturn будет новой головой.

+0

Получение исключения nullpointer. – user2725673

+0

@ user2725673, да, я вернулся previous.getNext(), если previous-> getNext() был ошибочным, а не предыдущим. Пожалуйста, попробуйте еще раз. –

1

Выполнение обратного метода LLNode делает вещи несколько проще.

Вы хотите вернуть последнее значение (и только последнее) в свой список. Если у вас есть это, вернитесь, иначе пойдете глубже, пока не получите его. После того, как у вас есть конец, сохраните его, setNext, поскольку вам больше не нужно значение следующего, верните конец.

public LLNode reverse(LLNode previous) { 
    if(getNext()==null) { 
     setNext(previous); 
     return this; 
    } 
    LLNode returnValue = getNext().reverse(this); 
    setNext(previous); 
    return returnValue; 
} 

public static void main(String[] args) { 
     LLNode ll = new LLNode(1,new LLNode(2, new LLNode(3, new LLNode(3, new LLNode(2, new LLNode(3, null)))))); 

     ll = ll.reverse(null); 
     System.out.println(ll); 

} 

В противном случае статический вариант, если он вам нужен по какой-либо причине.

public static LLNode reverse(LLNode current) { 
    if(current.getNext()==null) { 
     return current; 
    } 
    LLNode returnValue = reverse(current.getNext()); 
    current.getNext().setNext(current); 
    current.setNext(null); 
    return returnValue; 
} 

public static void main(String[] args) { 
     LLNode ll = new LLNode(1,new LLNode(2, new LLNode(3, new LLNode(3, new LLNode(2, new LLNode(3, null)))))); 

     ll = reverse(ll); 
     System.out.println(ll); 

}