1 问题
反向打印链表值
2 思考
1) 我们利用栈的思想,新进后出,把链表的每个元素分别入栈之后再打印栈
2)既然上面用到了栈,我们应该就会想到用到递归来实现
3 代码实现
#include <iostream>
#include <stack>
#include <stdlib.h>using namespace std;typedef struct node
{int value;struct node *next;
} Node;/***把链表的每一个元素遍历出来放进栈,然后利用*栈把先进后出的特点,然后打印栈*/
void reverse_printf(Node *head)
{if (head == NULL){std::cout << "head is NULL" << std::endl;return; }Node *p = head;stack<Node *> stk; while (p != NULL){stk.push(p);p = p->next;}while(!stk.empty()){Node *node = stk.top();std::cout << node->value << std::endl;stk.pop();}
}/***既然上面用到了栈,那么我们自然而然就会想到*用递归的思想,我们就自己调用自己直到遍历到最后*很明显我们递归的条件是最后一个原始的next不能为空*/
void reverse_printf1(Node *head)
{/**这样也行if (head == NULL){return; }reverse_printf1(head->next);std::cout << head->value << std::endl;**/if (head != NULL){reverse_printf1(head->next);std::cout << head->value << std::endl;}
}void printf(Node *head)
{if (head == NULL){std::cout << "head is NULL" << std::endl;return; }Node *p = head;while (p != NULL){std::cout << p->value << std::endl;p = p->next;}
}int main()
{Node *head = NULL;Node *node1 = NULL;Node *node2 = NULL;Node *node3 = NULL;head = (struct node*)malloc(sizeof(Node));node1 = (struct node*)malloc(sizeof(Node));node2 = (struct node*)malloc(sizeof(Node));node3 = (struct node*)malloc(sizeof(Node)); if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL){std::cout << "malloc fail" << std::endl;return -1;}head->value = 0;head->next = node1;node1->value = 1;node1->next = node2;node2->value = 2;node2->next = node3;node3->value = 3;node3->next = NULL;printf(head);std::cout << "***************" << std::endl;reverse_printf(head);std::cout << "***************" << std::endl;reverse_printf1(head);free(head);free(node1);free(node2);free(node3);return 0;}
4 运行结果
0
1
2
3
***************
3
2
1
0
***************
3
2
1
0