题目链接地址:
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:bzhou84@163.com
**********************************/
#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;
}