面试题5

来源:互联网 发布:jquery 格式化json 编辑:程序博客网 时间:2024/06/03 22:07

面试题5:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值

遍历链表的顺序是从头到尾,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出,“后进先出”,我们可以用栈实现这种顺序。每遍历一个结点时就把该节点放入栈中,遍历完整个链表在从栈顶开始输出节点的值。

代码如下:

void ReversedStack(ListNode* Head){ListNode* Node=Head;stack<ListNode*> node;while(Node!=NULL){node.push(Node);Node=Node->_next;        }while(!node.empty()){Node=node.top();cout<<Node->_val<<" ";node.pop();}      cout<<endl;}

递归实现,我们每次访问到一个结点时,先递归出他后面的结点,在输出自身。

代码如下:

void ReversedOrder(ListNode* Head){ListNode* Node=Head;if(Node!=NULL){if(Node->_next!=NULL){ReversedOrder(Node->_next);}cout<<Node->_val<<" ";}}
上述递归代码简洁,但存在问题,当链表很长是,函数调用的层级很深,导致函数调用栈溢出。

完整代码:

#include<iostream>#include<stdlib.h>#include<stack>using namespace std;//链表节点定义struct ListNode{int _val;ListNode* _next;};//创建一个链表结点ListNode* creat(int val){ListNode *Node=new ListNode();Node->_val=val;Node->_next=NULL;return Node;}void AddToTail(ListNode** Head,int val){ListNode* New=new ListNode();//新插入结点New->_val=val;New->_next=NULL;if(*Head==NULL)//空链表{*Head=New;}else{ListNode* Node=*Head;while(Node->_next!=NULL)Node=Node->_next;Node->_next=New;}}void ReversedStack(ListNode* Head){ListNode* Node=Head;stack<ListNode*> node;while(Node!=NULL){node.push(Node);Node=Node->_next;    }while(!node.empty()){Node=node.top();cout<<Node->_val<<" ";node.pop();}      cout<<endl;}void ReversedOrder(ListNode* Head){ListNode* Node=Head;if(Node!=NULL){if(Node->_next!=NULL){ReversedOrder(Node->_next);}cout<<Node->_val<<" ";}}void Print(ListNode* Head){ListNode* Node=Head;while(Node!=NULL){cout<<Node->_val<<" ";Node=Node->_next;}cout<<endl;}int main(){ListNode* Node=creat(1);Print(Node);AddToTail(&Node,2);AddToTail(&Node,3);AddToTail(&Node,4);AddToTail(&Node,5);AddToTail(&Node,6);AddToTail(&Node,7);AddToTail(&Node,8);Print(Node);ReversedStack(Node);ReversedOrder(Node);system("pause");return 0;}
运行结果:

                 


原创粉丝点击