簡體   English   中英

使用遞歸反轉列表元素

[英]Reversing elements of a list using recursion

目的是編寫代碼以借助遞歸來反轉列表的元素。

public static List<Integer> reverse(List<Integer> input) {
    if (input.isEmpty()) {
        return new LinkedList<Integer>();
    } else {
        List<Integer> output = new LinkedList<Integer>();
        output.add(((LinkedList<Integer>) input).removeLast());
        reverse(input);
        return output;
    }
}

不幸的是,我只正確地獲得了第一個元素,而列表的其余部分卻沒有出現。 我想念什么?

在注釋中如何提到它,您需要第二個參數,並且可能不需要返回值:

public static void reverse(List<Integer> input, List<Integer> output) {
    if (input.isEmpty()) {
        return;
    }
    output.add(((LinkedList<Integer>) input).removeLast());
    reverse(input, output);
}

用法:

List<Integer> input = new LinkedList<>();
// fill it with values
List<Integer> output = new LinkedList<>();

reverse(input, output);
System.out.println(output);

您可以像下面的代碼那樣執行此操作。 請注意,我正在使用removeFirst()方法。

import java.util.LinkedList;
import java.util.List;

public class Reverse {

  public static List<Integer> reverse(List<Integer> input) {
    if (input.isEmpty()) {
      return new LinkedList<Integer>();
    } else {
      Integer first = ((LinkedList<Integer>) input).removeFirst();
      List<Integer> output = reverse(input);
      output.add(first);
      return output;
    }
  }

  public static void main(String[] args) {

    List<Integer> input = new LinkedList<>();
    input.add(15);
    input.add(37);
    input.add(26);
    input.add(18);
    input.add(31);

    System.out.println("Input  : " + input);
    System.out.println("Output : " + reverse(input));
  }
}

為了方便起見,我在使用Stack作為其pop方法。

public static List<Integer> reverse(List<Integer> input) {
    Stack<Integer> stack = new Stack();
    stack.addAll(input);
    return reverse(stack,new LinkedList<>());
  }

  public static List<Integer> reverse(Stack<Integer> input,LinkedList<Integer> output) {
     if (input.isEmpty()) {
       return output;
     }
     output.addFirst(input.pop());
     reverse(input, output);
    return output;
  }

如果要跳過元素的重新添加,則需要維護索引,或使用知道第一個和最后一個元素的LinkedList。 這是與維護索引和純List API一起使用的:

public static List<Integer> reverse(List<Integer> input) {


     return reverse(input,new LinkedList<>(),0);
  }

  public static List<Integer> reverse(List<Integer> input,LinkedList<Integer> output,int index) {
     if (index == input.size()) {
       return output;
     }
     output.addFirst(input.get(index));
     reverse(input, output,++index);
    return output;
  }
// This will work for you

    public static void main(String[] args) {
            List<Integer> input = new LinkedList<Integer>();
            List<Integer> output = new LinkedList<Integer>();
            input.add(5);
            input.add(1);
            input.add(3);
            int size = input.size();
            System.out.println(reverse(input, size, output));

        }

        public static List<Integer> reverse(List<Integer> input, int sizeOfInput, List<Integer> output) {

            if (sizeOfInput > 0) {
                output.add(((LinkedList<Integer>) input).removeLast());
                sizeOfInput--;
                reverse(input, sizeOfInput, output);
            }
            return output;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM