博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从尾到头打印链表
阅读量:6249 次
发布时间:2019-06-22

本文共 3111 字,大约阅读时间需要 10 分钟。

  hot3.png

  题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

  思路:有两种方法。一种是借助栈的后进先出特性来实现;另一种是采用递归,递归的本质也是一个栈结构。

  测试用例

  1.输入链表只有一个结点、多个节点
  2.输入链表头指针为NULL

  代码:

栈:

#include
#include
#include
using namespace std;struct ListNode{ int m_nValue; ListNode* m_pNext;};ListNode* CreateListNode(int value){ ListNode* node = new ListNode(); node->m_nValue = value; node->m_pNext = NULL; return node;}void ConnectListNodes(ListNode* node1, ListNode* node2){ if (node1 != NULL && node2 != NULL) { node1->m_pNext = node2; }}void PrintListNode(ListNode* pHead){ if (pHead == NULL) { cout << NULL; } while (pHead != NULL) { cout << pHead->m_nValue << " "; pHead = pHead->m_pNext; } cout << endl;}void DestroyList(ListNode* pHead){ ListNode* node = pHead; while (node != NULL) { pHead = pHead->m_pNext; delete node; node = pHead; }}void PrintListTailToHead(ListNode* pHead){ stack
nodes; while (pHead != NULL) { nodes.push(pHead); pHead = pHead->m_pNext; } while (!nodes.empty()) { ListNode* node = nodes.top(); cout << node->m_nValue << " "; nodes.pop(); } cout << endl;}int main(){ ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); PrintListTailToHead(pNode1); DestroyList(pNode1); return 0;}

递归:

#include
#include
#include
using namespace std;struct ListNode{ int m_nValue; ListNode* m_pNext;};ListNode* CreateListNode(int value){ ListNode* node = new ListNode(); node->m_nValue = value; node->m_pNext = NULL; return node;}void ConnectListNodes(ListNode* node1, ListNode* node2){ if (node1 != NULL && node2 != NULL) { node1->m_pNext = node2; }}void DestroyList(ListNode* pHead){ ListNode* node = pHead; while (node != NULL) { pHead = pHead->m_pNext; delete node; node = pHead; }}void PrintListRecursion(ListNode* pHead){ if (pHead != NULL) { if (pHead->m_pNext != NULL) { PrintListRecursion(pHead->m_pNext); } } cout << pHead->m_nValue << " ";}int main(){ ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); PrintListRecursion(pNode1); DestroyList(pNode1); return 0;}

  递归的代码虽然简洁,但是当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。

转载于:https://my.oschina.net/134596/blog/1788192

你可能感兴趣的文章
《CSS世界》读书笔记(十六)
查看>>
初入前端
查看>>
(回文串 )Best Reward -- hdu -- 3613
查看>>
最少拦截系统------LCS--------动态规划
查看>>
关于EOF的种种。
查看>>
h5 拍照上传 代码
查看>>
javascript 通用定义
查看>>
语文文法
查看>>
SSM(Spring,SpringMVC,MyBatis)用户登录
查看>>
关于SQL注入,你应该知道的那些事
查看>>
jquery bxslider幻灯片样式改造
查看>>
常用JavaScript操作页面元素的方法
查看>>
学习进度条 12/18 到12/23
查看>>
varnish学习以及CDN的原理
查看>>
服务器配置 隐藏apache和php的版本
查看>>
将数据表中的数据导出到Excel、将Excel中的数据导入到数据表
查看>>
数据恢复系列(1)~恢复方案制定
查看>>
ASCII码值表
查看>>
关于Python中继承的格式总结
查看>>
2019年目标
查看>>