剑指offer-----链表(从尾到头打印链表的值)

题目:

输入一个链表,从尾到头打印链表每个节点的值。

问题解析:

*链表是动态数据结构,找其某个值,只能从头结点开始。后进先出结构。

链接:

剑指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);
	}
}

参考资料:

  1. 《剑指offer》
  2.  博客:http://cuijiahua.com/blog/2017/11/basis_3.html

猜你喜欢

转载自blog.csdn.net/qq_39503189/article/details/82116385
今日推荐