剑指offer 面试题05

本文介绍了一种链表数据结构的逆序打印方法,通过使用栈和递归两种方式实现,详细展示了代码实现过程及运行结果。

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

一般来说翻转过来打印链表中的值,应该不允许修改原链表的内容,由于顺序读取数据,打印是从尾到头,有种后进先出的感觉,很容易就能想到通过栈的方法来实现。

再引申一步,递归实际上也是一个栈的思想,所以也可以通过递归的方式来实现。

下面是代码:

package partOne;

import java.util.Stack;

public class PrintLinkNode {
    private static class LinkNode{
        int data; //节点的数据
        LinkNode nextLinkNode; //下一个节点
    }

    //采用栈的方式实现
    private void printLinkNodeByStack(LinkNode linkNode)
    {
        if(linkNode==null){
            return;
        }

        Stack<LinkNode> stackList = new Stack<>();
        LinkNode pNode = linkNode;
        while (pNode!=null){
            stackList.push(pNode);
            pNode = pNode.nextLinkNode;
        }

        LinkNode temNode;
        while (!stackList.isEmpty()){
            temNode = stackList.pop();
            System.out.println("栈节点值是:"+temNode.data);
        }

    }

    //采用递归的方式实现
    private void printLinkNodeByRecursion(LinkNode linkNode){
        if(linkNode!=null){
            if(linkNode.nextLinkNode!=null){
                printLinkNodeByRecursion(linkNode.nextLinkNode);
            }
        }
        System.out.println("递归节点值是:"+linkNode.data);
    }

    public static void main(String[] args) {
        LinkNode rootNode = new LinkNode();
        rootNode.data=1;
        rootNode.nextLinkNode = new LinkNode();
        rootNode.nextLinkNode.nextLinkNode = new LinkNode();
        rootNode.nextLinkNode.nextLinkNode.nextLinkNode = new LinkNode();
        rootNode.nextLinkNode.nextLinkNode.nextLinkNode.nextLinkNode = new LinkNode();
        rootNode.nextLinkNode.data=2;
        rootNode.nextLinkNode.nextLinkNode.data=3;
        rootNode.nextLinkNode.nextLinkNode.nextLinkNode.data=4;
        rootNode.nextLinkNode.nextLinkNode.nextLinkNode.nextLinkNode.data=5;

        LinkNode pNode = rootNode;
        while (pNode!=null){
            System.out.println("原链表值:"+pNode.data);
            pNode = pNode.nextLinkNode;
        }

        new PrintLinkNode().printLinkNodeByStack(rootNode);
        new PrintLinkNode().printLinkNodeByRecursion(rootNode);
    }

}

输出结果:

 

github代码地址:代码地址 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值