面试题—— 从尾到头打印链表
2015-07-30 17:29
309 查看
链表结点定义如下:
1.先将链表逆置, 然后遍历输出 ,但这样做会改变原链表的结构。
2.利用栈, 从头到尾遍历链表, 没遍历一个结点就进栈, 完成后输出栈顶值, 出栈, 直到栈空。
3.递归, 每访问一个结点, 先输出它后面的结点, 再输出自深。 但如果链表非常长, 可能会爆栈。
struct ListNode { int m_nKey; ListNode* m_pNext; }
1.先将链表逆置, 然后遍历输出 ,但这样做会改变原链表的结构。
void reverseOutput(ListNode* pHead) { if (pHead == NULL) { return; } ListNode* pPrior = NULL; ListNode* pNow = pHead; ListNode* pNext = pNow->m_pNext; while (pNow != NULL) { pNow->m_pNext = pPrior; pPrior = pNow; pNow = pNext; if (pNext!=NULL) { pNext = pNext->m_pNext; } } pHead = pPrior; pNow = pHead; while (pNow) { cout << pNow->m_nKey << " "; pNow = pNow->m_pNext; } cout << endl; }
2.利用栈, 从头到尾遍历链表, 没遍历一个结点就进栈, 完成后输出栈顶值, 出栈, 直到栈空。
void reverseOutput(ListNode* pHead) { if (pHead == NULL) { return; } std::stack<ListNode*> nodes; ListNode* pNode = pHead; while (pNode) { nodes.push(pNode); pNode = pNode->m_pNext; } while (!nodes.empty()) { pNode = nodes.top(); cout << pNode->m_nKey << " "; nodes.pop(); } cout << endl; }
3.递归, 每访问一个结点, 先输出它后面的结点, 再输出自深。 但如果链表非常长, 可能会爆栈。
void reverseOutput(ListNode* pHead) { if ( pHead!=NULL ) { if (pHead->m_pNext != NULL) { reverseOutput(pHead->m_pNext); } cout << pHead->m_nKey << " "; } }
相关文章推荐
- 【剑指Offer面试题】 九度OJ1519:合并两个排序的链表
- 程序员的恋情
- 黑马程序员--应用:用指针变量作为函数的参数,求出10个数的最大值
- 程序员面试宝典知识点笔记
- 黑马程序员 日记(十)
- 黑马程序员 日记(九)
- 黑马程序员 日记(八)
- 单链表面试题
- 黑马程序员-面试题(一)-交通灯管理系统
- 面试中发现的不足点
- 面试官最想听哪些话?
- ios面试总结
- 程序员的出路在哪里
- 【剑指Offer面试题】 九度OJ1518:反转链表
- 杭州嘉云数据电话面试
- 黑马程序员---iOS学习基础---数组与函数
- 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
- 黑马程序员---iOS学习基础---循环控制
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 12年程序员得到的12个经验教训