2015-06-22 2 views
0

Задача: Реверсивно реверсировать релятивистский список.Обратный список ссылок рекурсивно, почему это неправильно

Я знаю, как решить эту проблему, но один из моих рекурсивных методов неверен, я не могу понять, что не так с этим кодом. Может ли кто-нибудь это понять? Большое спасибо!

Тестовый пример: Input: [1,2,3] Выход: [3,1] Ожидаемое: [3,2,1]

public class Solution { 
    // recursive 
    ListNode last = null; 
    public ListNode reverseList(ListNode head) { 
     if (head == null) return null; 
     helper(head); 
     return last; 
    } 
    private ListNode helper(ListNode head) { 
     // base case 
     if (head.next == null) { 
      last = head; 
      return head; 
     } 
     // general case 
     ListNode prev = reverseList(head.next); // should be ListNode prev = helper(head.next); 
     prev.next = head; 
     head.next = null; 
     return head; 
    } 
} 
+2

Было бы полезно добавить тег для используемого вами языка программирования. – fvu

+0

Использование «глобального» (последнего) в возвращающей функции обычно является плохим знаком. –

+0

Другим плохим знаком является то, что вы возвращаете что-то из метода 'helper', который не используется в' reverseList' ... – Renzo

ответ

0

Это не работает , потому что в первом проходе метода helper

ListNode prev = reverseList(head.next); 

возвращается [3, 2], а затем назначить свой старый head (1), чтобы быть следующий узел после того, как новый час (3). Поэтому конечным результатом является [3, 1].

+0

Большое вам спасибо, я знаю, что сделал ошибку из-за моей небрежности. Я больше обращаю внимание на логику, но уделяю меньше внимания моему письму. – Junior

Смежные вопросы