九度OJ-题目1511:从尾到头打印链表

题目链接地址:

九度OJ-题目1511:从尾到头打印链表


题目描述:
输入一个链表,从尾到头打印链表每个节点的值。

输入:
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。

输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。

样例输入:
1
2
3
4
5
-1

样例输出:
5
4
3
2
1


解题思路:

学过数据结构的童鞋都知道链表是不能像数组那样通过下标去访问某个元素的,而且单链表中只有指向下一个结点的next指针,所以逆序打印链表不能像数组那样通过循环从最后一个元素依次遍历到第一个元素。因此我想到了以下的解法:
(1) 申请一个空栈,从头至尾依次遍历链表中的每一个结点,将所遍历结点的值保存到栈中;
(2) 输出当前的栈顶元素,然后将栈顶元素弹出栈,直到栈变空为止。
因为栈是一种后入先出的数据结构,所以通过以上两个步骤就能实现从尾到头打印链表。

AC代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stack>
using namespace std;
 
// 定义链表结点
typedef struct LinkNode
{
  int data;              // 数据域
  LinkNode * next;       // 指针域
}LinkList;
 
/**
* 构建单链表
* @return head 单链表的头指针
*/
LinkList * createLinkList()
{
   LinkList * head = (LinkList *)malloc(sizeof(LinkList));  // 构造头结点
   head -> next = NULL;
   LinkList * p = head;      // p是遍历指针
   int number;               // 输入数字
   while(1)
   {
       scanf("%d",&number);
       if(-1 == number)
           break;
       else                          // 在链表尾部插入元素
       {
           LinkList * s = (LinkList *)malloc(sizeof(LinkList));
           s -> data = number;
           s -> next = NULL;
           p -> next = s;
           p = s;                   // p始终指向链表中的最后一个结点
       }
   }
   return head;
}
 
/**
* 从头到尾遍历链表,则将链表的元素保存到栈中,然后逆序打印链表的元素
* @param head  链表的头指针
* @return void
*/
void printLinklistFromTailToHead(LinkList * head)
{
   stack <int> saveStack;
   LinkList * p = head -> next;
   while(p != NULL)
   {
       saveStack.push(p -> data);         // 将元素压入栈中
       p = p -> next;
   }
   // 依次输出栈中的元素
   while(!saveStack.empty())
   {
       printf("%d\n",saveStack.top());
       saveStack.pop();
   }
}
 
int main()
{
    LinkList * head = createLinkList();   // 构造链表
    printLinklistFromTailToHead(head);
    return 0;
}
 
/**************************************************************
    Problem: 1511
    User: blueshell
    Language: C++
    Result: Accepted
    Time:90 ms
    Memory:4484 kb
****************************************************************/


你可能感兴趣的:(面试题,剑指offer)