首页 > 代码库 > C++算法之 倒序输出一个链表
C++算法之 倒序输出一个链表
题目:给定一个头结点,倒叙输出一个链表
解法1:先将链表反转,在遍历输出
解法2:不修改链表自身的结构,动态申请一段空间,申请一个指针数组,数组内存放的指针指向链表的每个值,再遍历数组输出:
void PrintListBack(ListNode* head){ int n = GetLength(head); ListNode** p = new ListNode*[n+1]; p[n] = NULL; int i = 0; ListNode* pNode = head; while (i < n) { p[i] = pNode; pNode = pNode->m_pNext; ++i; } for (i = n-1; i>= 0; i--) { cout<<p[i]->m_nValue<<" "; }}
解法3:利用栈,后进先出;
void PrintListBack2(ListNode* head){ stack<ListNode> listStack; ListNode* pNode = head; while (pNode!=NULL) { listStack.push(pNode->m_nValue); pNode = pNode->m_pNext; } int i = listStack.size(); for (;i>0;i--) { ListNode p = listStack.top(); cout<<p.m_nValue<<endl; listStack.pop(); }}void PrintListBack3(ListNode* head){ stack<ListNode*> listStack; ListNode* pNode = head; while (pNode!=NULL) { listStack.push(pNode); pNode = pNode->m_pNext; } int i = listStack.size(); for (;i>0;i--) { ListNode* p = listStack.top(); cout<<p->m_nValue<<endl; listStack.pop(); }}
解法4:利用递归
void PrintListBack4(ListNode* head){ if (head != NULL) { if (head->m_pNext != NULL) { PrintListBack4(head->m_pNext); } cout<<head->m_nValue<<endl; }}
完整代码:
// PrintListBack.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <stack>using namespace std;struct ListNode { int m_nValue; ListNode* m_pNext; ListNode(int a):m_nValue(a),m_pNext(NULL) { }};int GetLength(ListNode* head){ ListNode* pNode = head; int nCount = 0; while (pNode!= NULL) { nCount++; pNode = pNode->m_pNext; } return nCount;}void PrintListBack(ListNode* head){ int n = GetLength(head); ListNode** p = new ListNode*[n+1]; p[n] = NULL; int i = 0; ListNode* pNode = head; while (i < n) { p[i] = pNode; pNode = pNode->m_pNext; ++i; } for (i = n-1; i>= 0; i--) { cout<<p[i]->m_nValue<<" "; }}void PrintListBack2(ListNode* head){ stack<ListNode> listStack; ListNode* pNode = head; while (pNode!=NULL) { listStack.push(pNode->m_nValue); pNode = pNode->m_pNext; } int i = listStack.size(); for (;i>0;i--) { ListNode p = listStack.top(); cout<<p.m_nValue<<endl; listStack.pop(); }}void PrintListBack3(ListNode* head){ stack<ListNode*> listStack; ListNode* pNode = head; while (pNode!=NULL) { listStack.push(pNode); pNode = pNode->m_pNext; } int i = listStack.size(); for (;i>0;i--) { ListNode* p = listStack.top(); cout<<p->m_nValue<<endl; listStack.pop(); }}void PrintListBack4(ListNode* head){ if (head != NULL) { if (head->m_pNext != NULL) { PrintListBack4(head->m_pNext); } cout<<head->m_nValue<<endl; }}int _tmain(int argc, _TCHAR* argv[]){ ListNode* head = new ListNode(0); ListNode* node1 = new ListNode(1); ListNode* node2 = new ListNode(2); ListNode* node3 = new ListNode(3); ListNode* node4 = new ListNode(4); ListNode* node5 = new ListNode(5); head->m_pNext = node1; node1->m_pNext = node2; node2->m_pNext = node3; node3->m_pNext = node4; node4->m_pNext = node5; node5->m_pNext = NULL; int n = GetLength(head); cout<<"个数为:"<<n<<endl; PrintListBack4(head); getchar(); return 0;}
C++算法之 倒序输出一个链表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。