比如:
eg1:
输入ab
输出ab,ba
eg2:
输入abc
输出abc,acb,bac,bca,cab,cba
定义了两个链表,一个存储源字符序列,即eg1中的a跟b,另一个作为栈使用,在每一次递归时往栈里面压一个字符,然后递归出来了就把这个字符退出栈。
递归函数中先判断是否递归到了尽头(就是存放源字符序列的链表已经为空),如果递归到了尽头,则输出栈中的所有字符。如果没有则进入下面的循环:
新建一个源字符序列的备份cpSrc,将第i个字符压栈,将cpSrc中的第i个字符移除,然后将现在的cpSrc作为新的源字符序列,交给函数next进行递归。递归完了回来再把第i个字符退栈。
i=(0,src.size());
代码如下:
public void next(LinkedList<Character> src,LinkedList<Character> head)
{
if (src==null) return;
if (head==null) head = new LinkedList<Character>();
if (src.isEmpty())
{
System.out.print(head+" ");
}
else {
for(int i=0;i<src.size();i++){
/* create a copy of the source list to use by the method
* which been called and avoid affecting the next iteration
*/
LinkedList<Character> cpSrc=new LinkedList<Character>(src);
head.add(cpSrc.remove(i));
next(cpSrc,head);
head.removeLast();
}
}
}