【剑指Offer面试题】 九度OJ1511:从尾到头打印链表

题目链接地址:
http://ac.jobdu.com/problem.php?pid=1511

从尾到头打印链表

时间限制:1 秒内存限制:128 兆特殊判题:否提交:6036解决:1817
题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
输入:
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
样例输入:
1
2
3
4
5
-1
样例输出:
5
4
3
2
1

分析:

方法一:借用栈倒序输出链表
链表在访问时总是从头开始访问,边访问边入栈,栈的特点就是先进后出,所以出栈时就是链表的反向输入。
方法二:递归实现,完美
每访问到一个结点,就递归访问输出后面的一个结点,然后再输出结点自身,最终就是反向输出。

方法二的九度AC实现:

/********************************* ----------------------------------- 【剑指Offer面试题】从尾到头打印链表 ----------------------------------- Author:牧之丶 Date:2015年 Email:[email protected] **********************************/  
#include <stdio.h>
#include <stdlib.h> 
#include <cstring>
#include <string>
#include <iostream> 
using namespace std;  

typedef struct Node
{
    int data;
    struct Node *next;
}Node,*pNode;

/* 递归从尾到头打印单链表 */
void PrintListReverse(pNode pHead)
{
    if(pHead == NULL)
        return;
    if(pHead->next != NULL)
        PrintListReverse(pHead->next);
    printf("%d\n",pHead->data);
}

pNode CreateList()
{
    int val;
    pNode pHead = NULL;
    pNode pCur = NULL;
    do
    {
        scanf("%d",&val);
        if(val != -1)
        {
            pNode pNew = (pNode)malloc(sizeof(Node));
            pNew->data = val;
            pNew->next = NULL;

            if(pHead == NULL)
            {
                pHead = pNew;
                pCur = pHead;
            }
            else
            {
                pCur->next = pNew;
                pCur = pCur->next;
            }
        }
    }while(val != -1);

    return pHead;
}
int main()
{
    pNode pHead = CreateList();
    PrintListReverse(pHead);
    return 0;
}

你可能感兴趣的:(链表,面试,输出,剑指offer)