[Jobdu] 题目1511:从尾到头打印链表——单链表的倒置输出
2015-08-05 20:49
417 查看
// ListNode typedef struct LNode { int key; struct LNode *next; }LNode;
分析:这是一道很有意思的面试题,此题以及此题的变体经常出现在各大公司的面试、笔试中。
看到这道题后,第一反应是从头到尾输出比较简单。然后经过分析,这道题有以下几种解决方法:
将链表中节点的指针反转过来,然后在从头到尾输出节点中的值
当要倒置输出值时,我们会想到用栈来实现。所以这种方法是,遍历链表节点中的值,依次入栈,最后弹栈输出
仔细分析这两种方法,解决问题都需要两步。方法一显然不是面试官想要的算法,而方法二需要维护一个额外的栈,在不借用STL容器时,实现起来比较麻烦,那么有没有一步到位的算法呢?
答案是肯定的,仔细分析第二种方法,需要用到栈来实现这个函数,而递归本质上就是一个栈结构。于是想到要用递归的思想来解决问题。下面贴出用递归实现的代码,这类问题要理解,并且能够运用这种递归思想来解决类似的问题:
// given a head pointer, print key from the end to the beginning void printListReversely(LNode *head) { if (head) { if (head->next) printListReversely(head->next); } printf("%d ", head->key); }
扩展:
给定一个未知长度的字符串,从尾到头输出一个字符窜(在不使用string.h文件中strlen函数的前提下)
定义一个函数求字符串的长度,要求函数内部不能声明任何变量
// print string reversely void printStringReversely(const char *str) { if (*str != '\0') { if (*(str + 1) != '\0') printStringReversely(str + 1); } else { printf("\n"); return; } printf("%c", *str); }
// strlen implemented by recursion int strlen(const char *str) { if (*str == '\0') return 0; else return strlen(str + 1) + 1; }
相关文章推荐
- hdu5347 MZL's chemistry(打表)
- 简单性能测试: bottle vs flask
- C++ 成员函数的重载与覆盖与隐藏
- CSS3 Media Query:移动 Web 的完美开端
- "余弦相似性"(cosine similiarity)比较相似文章
- 测试打印功能
- hdu 4034 2011成都赛区网络赛 逆向floyd **
- Ubuntu14.04 安装Cuda
- POJ 题目2892 Tunnel Warfare(线段树单点更新查询,求单点所在最大连续区间长度)
- hdu 5351 MZL's Border(15多校第五场1009)
- hdu5344 MZL's xor(水题)
- tcp 多线程与多进程调用close
- VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
- iOS- <项目笔记>项目配置常见文件
- 8.05(生产和消费线程)
- C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。
- HDOJ1213(并查集)
- nyoj 47 过河问题(贪心)
- HDU 2553 N皇后问题
- hdu 5349 MZL's simple problem(15多校第五场1007)