剑指Offer---面试题5:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印每个节点的值.


分析1:

通常,打印是一个只读操作,我们不希望打印的同时去修改原数据的内容.故我们不能改变链表的结构.解决这个问题肯定是需要遍历链表的,但是遍历的顺序是从头到尾的,可输出的顺序确实从尾到头,也就是说第一个遍历到的节点最后一个输出,最后一个遍历到的节点第一个输出. 这是典型的”先进后出“,我们可以利用栈来实现这种顺序;

代码1:

/*
 *链表的数据结构
 */
class ListNoede{
    int value;
    ListNode next=null;
    ListNode(int value){
        this.value=value;
    }
}

/*
 *具体实现类
 */
public class Solution{
    public ArrayList<Integer> printListFromTailToHead(ListNoede listNode){
        Stack<Integer>stack=new Stack<Intger>();
        while(listNode!=null){
            stack.push(listNode.value);//入栈操作
            listNode=listNode.next;
        }
        ArrayList<Integer>arrayList=new ArrayList<Integer>();
        //注意此处遍历栈的方法
        while(!stack.isEmpty()){
            arrayList.add(stack.pop());//出栈操作,并添加到List集合中
        }
        return arrayList;       

    }
}

/*
 *测试代码
 */
 public class carry {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        Solution solution = new Solution();

        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        listNode5.next=null;

        ArrayList<Integer> tailToHeadList = solution.printListFromTailToHead(listNode1);

        for (Integer integer : tailToHeadList) {
            System.out.println(integer);
        }
    }
}

输出结果:5 4 3 2 1


分析2:

根据分析1中的栈结构,可以联想到,递归在本质上就是一个栈结构,于是也可以用递归来实现; 我们每访问到一个节点的时候,首先输出它后面的节点,再输出其本身的节点,这样链表的结构就反过来输出了.

代码2

class Solution{
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<Integer>();
        ListNode pNode=listNode;
        if(pNode!=null){
            if(pNode.next!=null){
            //递归调用
            list=printListFromTailToHead(pNode.next);
            }
        list.add(pNode.value);
        }       
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值