首页 > 其他 > 详细

不借助辅助空间,颠倒栈内元素

时间:2014-04-13 01:38:59      阅读:424      评论:0      收藏:0      [点我收藏+]

题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5}1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1}5处在栈顶。

分析:我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶元素1和剩下的部分{2, 3, 4, 5}。如果我们能把{2, 3, 4, 5}颠倒过来,变成{5, 4, 3, 2},然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成{5, 4, 3, 2, 1}

接下来我们需要考虑两件事情:一是如何把{2, 3, 4, 5}颠倒过来变成{5, 4, 3, 2}。我们只要把{2, 3, 4, 5}看成由两部分组成:栈顶元素2和剩下的部分{3, 4, 5}。我们只要把{3, 4, 5}先颠倒过来变成{5, 4, 3},然后再把之前的栈顶元素2放到最底部,也就变成了{5, 4, 3, 2}

至于怎么把{3, 4, 5}颠倒过来……很多读者可能都想到这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来,再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了。这种思路的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//不借助辅助空间,将栈内元素颠倒
private static void reverse(LinkedList<Integer> linkedList) {
    if (linkedList.size() == 1)
        return;
    Integer o = linkedList.pop();
    reverse(linkedList);
    putToBottom(linkedList, o);
}
 
static private void putToBottom(LinkedList<Integer> stack, Integer o) {
    if (stack.isEmpty()) {
        stack.push(o);
        return;
    }
    Integer o2 = stack.pop();
    putToBottom(stack, o);
    stack.push(o2);
}

  

不借助辅助空间,颠倒栈内元素,布布扣,bubuko.com

不借助辅助空间,颠倒栈内元素

原文:http://www.cnblogs.com/cugb-2013/p/3661357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!