2015-11-28 3 views
4

В настоящее время я создаю метод реверсировать LinkedList в Java, но это требует два метода:Есть ли способ объединить эти два метода?

public void reverse(){ 
    reverse(head); 
} 

private void reverse(Node h){ 
    if(h.next==null){ 
     System.out.print(h.data+" "); 
     return; 
    } 

    reverse(h.next); 
    System.out.print(h.data+" "); 
} 

Этот способ я называю обратный метод с 0 параметров, которые затем называет другой обратный метод. Есть ли способ сделать их одним методом, не изменяя другие аспекты моего класса LinkedList?

Заранее благодарен!

+0

вызов 'reverse (head)' непосредственно, сделать метод общедоступным, поэтому он будет доступен. – YoungHobbit

+3

Лучше, чем два метода. Очень часто существует публичный метод, вызывающий частный рекурсивный метод с дополнительными параметрами. –

+0

@YoungHobbit Мой основной класс не имеет доступа к головному узлу. – idude

ответ

5

Общепринято, чтобы публичный метод вызывал частный рекурсивный метод с дополнительными параметрами. Для примера см. Исходный код для Arrays.deepToString(Object[]).

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

Альтернативой является использование петель вместо этого. Было бы занято:

public void reverse(){ 
    List<Node> nodes = new ArrayList<>(); 
    for (Node n = head; n != null; n = n.next) 
     nodes.add(n); 
    for (int i = nodes.size() - 1; i >= 0; i--) 
     System.out.print(nodes.get(i).data + " "); 
} 
3

Технически, есть способ, но я бы не рекомендовал его. Это он:

public void reverse(Node... nodes) 
{ 
    Node h; 
    if(nodes.length == 0) 
     h = head; 
    else 
    { 
     assert nodes.length == 1; 
     h = nodes[0]; 
    } 

    if(h.next == null) 
    { 
     System.out.print(h.data + " "); 
     return; 
    } 

    reverse(h.next); 
    System.out.print(h.data + " "); 
} 

Обратите внимание, что это также потребует решений класса Node общественности, которая также не является хорошей идеей. (Или вы можете просто получить предупреждение о том, что публичный метод принимает параметр частного типа, который вы затем можете подавить, я не помню.)

Но комментарий Пола Боддингтона прямо на деньги.

1

Да. Вы можете сделать параметр в отображаемом втором методе «действовать» как необязательный параметр. В приведенном ниже описании метода мы по существу делаем параметр Node Type как массив узлов, который может быть передан как пустой. Поскольку нам нужен только один параметр для нашего метода, тогда нам нужны только предоставленные данные Node, содержащиеся в элементе Index of 0 (первый элемент массива).

В самом мы объявляем переменную Node, который был тот же тип и имя, что ваш параметр был так, чтобы устранить путаницу в коде тела метода и мы предлагаем по умолчанию 0 (по умолчанию может быть методом все что пожелаете). Затем мы проверяем новый параметр arrayInfo [] array, чтобы увидеть, есть ли что-либо, и если бы мы применили эти данные из первого элемента массива headerInfo [] (поскольку мы используем только один параметр для этого метода) новая переменная типа узла h. args [] параметр для основной метод в классе делает то же самое.

public void reverse(Node... headerInfo){ 
    Node h = 0; 
    if (headerinfo.length != 0) { h = headerInfo[0]; } 

    if(h.next==null){ 
     System.out.print(h.data+" "); 
     return; 
    } 

    reverse(h.next); 
    System.out.print(h.data+" "); 
} 

Теперь метод можно можно назвать обратной() или назад (голова)

EDIT:

Whops ...Майк бил меня к нему :)

+0

---------- C -: = –

2

Пол бил меня к подобному ответу, но я полагал, что я отправлю мину в любом случае, так как я предполагал, что вы не хотите использовать ArrayList как зависимость:

Да оно возможное. Если это список с двойной связью, вы можете пройти список до последнего узла, затем перейдите в список вперед. Однако я также предполагаю, что это единственный связанный список, поэтому я отвечу на использование массива для хранения всех ссылок на узлы. Кроме того, я полагаю, у вас есть другой метод вычисления длины.

public void reverse() { 
    int length = length(); 
    Node [] nodes = new Node[length]; 
    Node currentNode = head; 

    int i = 0; 
    // Populate the array 
    while(currentNode != null) 
    { 
     nodes[i] = currentNode; 
     currentNode = currentNode.next; 
     i++; 
    } 

    // Iterate backwards to print the array 
    for(int j = length -1; j >= 0; j--) 
    { 
     System.out.println(nodes[i] + " "); 
    } 
} 
Смежные вопросы