1、题目描述
输入一个链表的头结点,从尾到头反过来打印出每个节点的值
2、利用栈实现逆序打印单链表
遍历的顺序是从头到尾,可是题目要求输出的顺序确是从尾到头。
也就是第一个遍历的节点最后一个输出,最后遍历的节点最先输出;
我们就可以利用栈来实现这种“先进后出”的顺序。
源码:
//利用栈实现逆向打印链表
void PrintListFromTail2Head_Stack(pNode pHead){
stack<pNode> nodes;
pNode pCur = pHead;
while (pCur != NULL){
nodes.push(pCur);
pCur = pCur->_pNext;
}
while (!nodes.empty()){
pCur = nodes.top();
printf("%d\t", pCur->_data);
nodes.pop();
}
}
3、利用递归实现单链表的逆向打印
首先递归在本质上就是一个栈结构。
我们每访问到一个节点的时候,先递归的输出他后面的节点,在输出该节点自身。
【存在的缺陷】:当链表很长的时候,就会导致函数调用的层级过深,从而有可能导致函数调用栈溢出。
源码:
// 逆向打印单链表 --递归实现
void PrintListFromTail2Head(pNode pHead)
{
if (pHead != NULL){
if (pHead->_pNext != NULL){
PrintListFromTail2Head(pHead->_pNext);
}
printf("%d\t", pHead->_data);
}
}
4、单链表的其他基本操作
测试代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include"LinkedList.h"
void test1(){
pNode pHead1;
InitList(&pHead1);
PushBack(&pHead1,2);
PushBack(&pHead1,4);
PushBack(&pHead1,6);
PushBack(&pHead1,8);
printf("使用递归方式逆向打印链表:\n");
PrintListFromTail2Head(pHead1);
printf("\n");
printf("利用栈实现逆向打印链表:\n");
PrintListFromTail2Head_Stack(pHead1);
printf("\n");
}
int main(){
test1();
system("pause");
return 0;
}