【转】http://zhedahht.blog.163.com/blog/static/2541117420079237185699/
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。
看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。反转链表的算法详见本人面试题精选系列的第19题,在此不再细述。但该方法需要额外的操作,应该还有更好的方法。
接下来的想法是从头到尾遍历链表,每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始输出结点的值,此时输出的结点的顺序已经反转过来了。该方法需要维护一个额外的栈,实现起来比较麻烦。
既然想到了栈来实现这个函数,而递归本质上就是一个栈结构。于是很自然的又想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
基于这样的思路,不难写出如下代码:
///////////////////////////////////////////////////////////////////////
// Print a list from end to beginning
// Input: pListHead - the head of list
///////////////////////////////////////////////////////////////////////
void PrintListReversely(ListNode* pListHead)
{
if(pListHead != NULL)
{
// Print the next node first
if (pListHead->m_pNext != NULL)
{
PrintListReversely(pListHead->m_pNext);
}
// Print this node
printf("%d", pListHead->m_nKey);
}
}
扩展:该题还有两个常见的变体:
1. 从尾到头输出一个字符串;
2. 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。
分享到:
相关推荐
题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于...对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
本问题探讨了如何从尾到头地打印链表,即逆序遍历链表并输出其元素值。 解法一采用了栈这一数据结构来实现。栈是一种后进先出(LIFO)的数据结构,适合用于解决此类问题。具体步骤如下: 1. 初始化一个空栈。 2. ...
剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输出:[2,3,1]辅助栈// 辅助栈s
要从尾到头打印链表,一种直接的方法是先遍历整个链表,记录每个节点,然后反向输出。但是,这种方法在内存消耗上并不理想,因为它需要存储所有节点。另一种更高效的方法是使用两个指针,一个快指针每次移动两步,一...
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 思路 遍历链表,把结构保存在list里面,然后把list逆序输出 代码 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x #...
这种问题通常出现在数据结构和算法的学习中,它要求我们不按照传统的顺序(从头到尾)而是逆序地输出链表的元素。在这里,我们可以通过辅助的数据结构——栈(stack)来实现这一目标。下面我们将详细讨论这个问题的...
同时,我们还需要编写一个TraverseBackwards函数,用于从尾到头输出链表中的所有节点。 五、依据姓名查找结点及修改结点数据的功能 在实现依据姓名查找结点及修改结点数据的功能时,我们需要编写一个FindByName...
题目要求从尾到头输出链表节点的值。这可以通过两种方法实现:递归和栈。递归方法是通过递归调用自身,每次处理当前节点的下一个节点,直到遍历到链表末尾,然后回溯打印节点值。栈方法则是将链表的所有节点压入栈...
要从尾到头输出链表,可以使用栈(先进后出)的数据结构,或者通过迭代或递归的方式来实现链表节点的逆序遍历。 6. 最大金币问题:这是一个概率模型构建与计算问题。需要建立概率模型来计算在给定策略下拿到最多...
如果要求反向打印,即从尾到头输出链表的元素,可以使用栈来实现。 解题思路如下: - 创建一个栈,遍历链表。 - 将遍历到的每个节点的值压入栈中。 - 最后栈顶到栈底的顺序即为链表节点值的反向顺序。 此方法的...
对于链表从尾到头打印的问题,可以采用递归方式,递归函数会持续调用自身直到达到链表的末尾(头节点),然后在回溯阶段依次打印节点值。 在提供的代码中,递归版本的`printListFromTailToHead`函数如下所示: ```...
然后调用`print_end_to_head`方法,从尾到头打印链表,输出结果为4, 3, 2, 1。 此外,注释中还提到了一种打印对象属性的方法,使用`obj.__dict__.items()`可以获取对象的所有属性及其值,通过列表推导式构建字符串...
3. **从尾到头输出链表并求和**:遍历链表,从尾结点开始,逐个访问结点,同时累计结点数据,最后返回累计结果。 4. **字符串比较**:编写一个程序,不使用strcmp函数比较两个字符串。可以通过逐字符比较,根据...
- **从尾到头输出链表**:可以通过递归的方式来实现。 - **不能被继承的类**:在面向对象编程中,有时需要阻止类被继承,可以使用私有继承等方式来实现。 - **在O(1)时间删除链表结点**:通过修改指针指向的方式实现...
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输出:[2,3,1]限制:0 链表长度 * Definiti
逆序输出链表则需要从尾节点到头节点打印节点的值。有多种方法可以实现这一操作,这里我们介绍两种常见方法: 1. **迭代法**:通过两个指针,一个指向当前节点,另一个指向前一个节点,从头到尾遍历链表,反转指针...
5. **逆向输出**:从尾到头遍历链表并打印节点数据。 以下是链表类的一个可能实现: ```cpp class DoublyCircularLinkedList { private: Node* head; public: DoublyCircularLinkedList() : head(nullptr) {} ...
这种结构使得双向链表支持双向遍历,即可以从头到尾或者从尾到头访问链表中的元素。 本文将详细介绍如何在双向链表上实现基本的操作,包括创建、查找、删除、反转以及输出等,并且通过具体的代码示例来解释每个功能...
"面试笔试真题(C++)-2017年牛客精华" 从给定的文件信息中,我们可以总结出以下几个关键知识点: 1. C++中的继承:派生类对象可以访问基类成员...3. 从尾到头打印链表:输入一个链表,从尾到头打印链表每个节点的值。