从尾到头打印单链表
要实现从尾到头打印链表,方法很多,但常用的有两种方法,一是递归,二是利用栈。
首先定义一个链表:
struct ListNode{ int m_nKey; //值 ListNode* m_pNext; //指向下一个值的指针 }
第一种利用递归的方法:
void PrintListReversingly_Recursively(ListNode* pHead){ if(pHead!=NULL) { //先判断链表是否为空 if(p_Head->m_pNext !=NULL) { //然后判断链表中只有一个元素 PrintListReversingly_Recursively(pHead->m_pNext); //递归到下一个元素 } printf("%d\t",pHead->m_nValue); //如果只有一个元素的时候,就打印这个元素,此时已经递归到最后一个元素,即从最后一个元素开始打印,然后层层返回,依次打印到第一个元素 } }
第二种方法是调用栈,因为栈是先进后出的,所以我们需要先创建一个栈,用来存储链表中的元素,当链表中所有的元素都被栈存储后,就将这些元素依次打印
#include <stack> using namespace std; void PrintListReversingly_stack(ListNode* pHead){ stack<ListNode*> nodes; //创建一个能够容纳ListNode*类型元素的栈 ListNode* pNode=pHead; //创建ListNode*类型的头指针,用来指向链表的第一个元素 while(pNode != NULL){ //当pNode还没有遍历完链表时 nodes.push(pNode); //就将当前所指的元素放在栈里面 pNode=pNode->m_pNext; //然后继续指向链表中的下一个元素,直到将所有的元素都放在栈中 } while(!nodes.empty()){ //此时开始遍历栈里面的元素 pNode=nodes.top(); //首先将pNode指针指向栈顶元素 printf("%d\t",pNode->m_nValue); //依次打印出栈里面的元素 nodes.pop(); 将已打印的元素弹出栈,然后指向下一个元素 } }
这两种方法相比而言,递归的方法比较简单,但是递归的本质就是一个栈结构。如果链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显示用栈基于循环实现的代码鲁棒性要好一些。