题目:
输入一个链表,从尾到头打印链表每个节点的值。
问题解析:
*链表是动态数据结构,找其某个值,只能从头结点开始。后进先出结构。
链接:
剑指Offer
思路标签:
数据结构:链表、栈、vector
算法:递归
解答:
1. C++
- (1) 从头到尾输出比较简单,一种想法是反转结点的指针。但是会破坏原链表的结构,不推荐;
- (2) 从头遍历链表,先访问的后输出,后访问的先输出,“后进先出”,利用栈来实现;
- (3) 递归本质上就是一个栈的结构,可以利用递归来实现。但是当链表比较长的时候,递归会导致函数调用的层级很深,有可能会导致函数调用栈的溢出,故还是推荐使用栈来实现。
/*
struct Listnode
{
int value;
struct Listnode *next
}
*/
//有返回值
class Solution
{
public:
vector<int> printListFromTaiLToHead(Listnode *head)
{
stack<int> nodes; //建立一个栈
vector<int> result;
Listnode* node = head;
while(node!=NULL)
{
nodes.push(node->value); //将value压入栈中
node = node->next;
}
while(!nodes.empty())
{
result.push_back(nodes.top());
nodes.pop();
}
return result;
}
}
//无返回值
void printListFromTaiLToHead(Listnode *head)
{
stack<Listnode*> nodes;
Listnode* node = head;
while(node!=NULL)
{
nodes.push(node); //将节点压入栈中
node = node->next;
}
while(!nodes.empty())
{
node=nodes.top();
printf("%d\t",node->value);
nodes.pop();
}
}
2.递归实现:
//递归版本
void printListFromTaiLToHead(Listnode *head)
{
if(head!=NULL)
{
if(head->next!=NULL)
{
printListFromTaiLToHead(Listnode head->next);
}
printf("%d\t",head->value);
}
}
参考资料:
- 《剑指offer》
- 博客:http://cuijiahua.com/blog/2017/11/basis_3.html