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

1 题目:

输入一个链表的头结点,从尾到头打印每个节点的值。链表定义如下:

struct ListNode
{
	int m_nkey;
	ListNode* m_pNext;
}

2 思路

由于遍历的顺序是从头到尾,而输出的顺序是从尾到头,典型的后进先出,可以利用栈实现这种顺序。每经过一个节点,将其存入栈中,当遍历完链表后,再从栈顶顺序输出节点的值。

3 代码示例

void printListReversingly_Iteratively(ListNode* pHead)
{
	std::stack<ListNode*> nodes;
	ListNode *pNode = pHead;
	while(pNode!=nullptr)
	{
		nodes.push(pNode);
		pNode = pNode->m_pNext
	}
	while(!nodes.isempty())
	{
		pNode = nodes.top();
		printf("%d\t",pNode->m_nkey);
		nodes.pop();
	}
}

由于递归本质上也是一种栈结构,也可以使用递归的方式输出链表,每访问到一个节点的时候,先递归输出后面的节点,再输出自身节点,这样链表输出结果就返过来了。

void PringListReversingly_recursively(ListNode* pHead)
{
	if(pHead!=nullptr)
	{
		if(pHead->m_pNext!=nullptr)
		{
			PringListReversingly_recursively(pHead->m_pNext);
		}
		printf("%d\t",pNode->m_nkey);
	}
}

可能存在的问题:当链表非常场的时候,就会导致函数调用的层级很深,从而很有可能导致函数调用栈溢出。

posted @ 2021-03-14 14:08  一地斜阳  阅读(64)  评论(0)    收藏  举报