【剑指offer】面试题6 从尾到头打印链表

1.主旨

  • 这道题就是一个很基本的对于单向链表结构的考察,而单向链表的节点结构最基本的就是一个value值和一个next指针,只要清楚这一点,那么无论是从尾到头打印、存储,抑或是从头到尾打印、存储就都变成了简单操作的事情。

2.考点

  • 考点1:单向链表的结构与基本节点格式;
  • 考点2:对于栈结构与递归关系的理解,以及两者与循环的区别理解;

3.代码

3.1 栈结构存储
  • 使用stack来从头到尾入栈,出栈时则是从尾到头出栈;
  • 时间复杂度O(n),空间复杂度O(n),牛客网时间3ms,内存480K
//1.使用stack栈结构来存储数据,然后顺序出栈即可
vector<int> printListFromTailToHead1(ListNode* head) 
{
	ListNode* node = head;
	stack<int> m_stack;
	while (node != NULL)
	{
		m_stack.push(node->val);
		node = node->next;
	}
	vector<int> temp;
	//C++的stack的pop函数为void返回类型,所以需要手动赋值
	while (!m_stack.empty())
	{
		temp.push_back(m_stack.top());
		m_stack.pop();
	}
	return temp;
}
3.2 递归实现
  • 递归嵌套就是栈结构的一种扩充,其优势在于无需使用stack来存储数据,但是对于本题是存储数据而不是打印数据(无论怎样都还是要用一个vector来存数据)来看,其效率也就没有那么大的优势了;
  • 时间复杂度O(n),空间复杂度O(n)牛客网时间4ms,内存480K
//2.使用递归嵌套,不采用stack来做临时缓存(能避免数据量过大栈溢出的问题)
vector<int> temp2;
vector<int> printListFromTailToHead(ListNode* head)
{
	if (head != NULL)
	{
		printListFromTailToHead(head->next);
		temp2.push_back(head->val);
	}
	return temp2;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸间沧海桑田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值