package com.zhangry.interview.java.circulate;import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class Circulate {    public static void main(String[] args) {
        String[] array = {"1","2","3","4"};
        listAll(Arrays.asList(array),"");
    }
    
    private static void listAll(List candidate,String prefix){
        System.out.println(prefix);
        for(int i=0;i<candidate.size();i++){
            List temp = new LinkedList(candidate);
            listAll(temp,prefix+temp.remove(i));
        }
    }}

解决方案 »

  1.   

    linkedlist的remove()
    remove
    public E remove(int index)移除此列表中指定位置处的元素。将任何后续元素向左移(从索引中减 1)。返回从列表中删除的元素。 指定者:
    接口 List<E> 中的 remove
    覆盖:
    类 AbstractSequentialList<E> 中的 remove
    参数:
    index - 要移除的元素的索引 
    返回:
    以前在指定位置的元素 
    抛出: 
    IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())
      

  2.   

    递归嘛,最外层循环4次,每次构造一样的list(1234)。然后递归时,分别去掉第0,1,2,3,位元素,然后先输出这个去掉的元素的值,就是单独输出的1,2,3,4。而去除掉一个元素后的list作为递归的参数。再循环这个list时,恰好没有prefix这个值,所以后面的输出不会有重复值。