输入一个链表的头结点,从尾到头反过来打印每个结点的值——5

  

,,一般这样的题,链表肯定不会是一个双向链表还带个循环什么的,也就是只给一个单链表的头结点,然后从尾到头输出每个结点的值;

,,如果从前往后去找最后一个结点,那找到了输出然后就没办法往返回往头部访问了,因为只是个单链表,因此可以想到,用递归来实现:

# include  & lt; iostream>   using  namespace 性传播疾病;      template  & lt; class  T>,,,,,,,,,,,//将链表的结点定义为模板类,实现代码的复用性   struct  ListNode   {   ,,,T  _data;   ,,,ListNode *, _next;   };      template  & lt; class  T>   ListNode *, buy_node (T 数据),,,,,,,,//创建结点   {   ,,,ListNode *, tmp =, new  ListNode;   ,,,tmp→_data =,数据;   ,,,tmp→_next =,空;   ,,,return  tmp;   }      template  & lt; class  T>   void  init_list (ListNode * *,节点,T 数据),,//链表的初始化   {   ,,,* node =, buy_node(数据);   }      template  & lt; class  T>   void  push_node (ListNode *,,,, T 数据),,,,,,//向链表中插入结点   {   ,,,如果(head ==, NULL)   ,,,{,,   ,,,,,,,init_list(,,,数据);   ,,,,,,,返回;   ,,,},,,   ,,,ListNode *, tmp =,头;   ,,,,(tmp→_next  !=, NULL)   ,,,{,,   ,,,,,,,tmp =, tmp→_next;   ,,,}   ,,,tmp→_next =, buy_node(数据);   }      template  & lt; class  T>   void  destroy_list (ListNode *,,头),,,//销毁链表   {   ,,,如果(head  !=, NULL)   ,,,{   ,,,,,,,ListNode *, cur =,头;   ,,,,,,,ListNode *, tmp =,头;   ,,,,,,,,(cur  !=, NULL)   ,,,,,,,{   ,,,,,,,,,,,tmp =,坏蛋;   ,,,,,,,,,,,cur =,坏蛋→_next;   ,,,,,,,,,,,delete  tmp;   ,,,,,,,}   ,,,,,,,head =,空;   ,,,}   }      template  & lt; class  T>   void  print_list (ListNode *,头),,,//正序打印链表的数据   {   ,,,,(head  !=, NULL)   ,,,{   ,,,,,,,cout<& lt;头→_data<& lt;“→”;   ,,,,,,,head =,头→_next;   ,,,}   ,,,cout<& lt;“零”& lt; & lt; endl;   }      template  & lt; class  T>   void  ReversePrintList (ListNode *,头),,//逆序打印链表,用递归   {   ,,,如果(head  !=, NULL)   ,,,{   ,,,,,,,ReversePrintList(头→_next);   ,,,,,,,cout<& lt;头→_data<& lt;“→”;   ,,,}   ,,,   ,,,,,,,cout<& lt;“零→”;   }      int  main ()   {   ,,,ListNode *, list =,空;   ,,,push_node(列表,1);   ,,,push_node(列表,,2);   ,,,push_node(列表,,3);   ,,,push_node(列表,,4);   ,,,push_node(列表,,5);   ,,,push_node(列表,,6);   ,,,push_node(列表,,7);   ,,,push_node(列表,,8);   ,,,push_node(列表,,9);      ,,,cout<& lt;“print 列表:”;   ,,,print_list(列表);   ,,,cout<& lt;“reverse  print 列表:”;   ,,,ReversePrintList(列表);   ,,,cout<& lt; endl;   ,,,,   ,,,destroy_list(列表);   ,,,return  0;   }

上面的栗子中只为了完成题目要求并没有实现链表的其他操作,比如流行数据以及查找删除插入等函数,运行程序可得如下结果:

输入一个链表的头结点,从尾到头反过来打印每个结点的值——5


,,从上面的程序可以知道,将链表逆序输出其实就是后插入的结点先输出,最开始放进去的结点最后输出,因此也就是后进先出的原则,可以用栈来实现,从头开始遍历链表,将结点一一push_back方法进栈里面,然后再从栈顶取出数据,取到的就是链表的最后一个结点,再不断地流行数据然后取栈顶;

,,null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

输入一个链表的头结点,从尾到头反过来打印每个结点的值——5