劍指offer之反向打印鏈表值
1 問(wèn)題
反向打印鏈表值
2 思考
1) 我們利用棧的思想,新進(jìn)后出,把鏈表的每個(gè)元素分別入棧之后再打印棧
2)既然上面用到了棧,我們應(yīng)該就會(huì)想到用到遞歸來(lái)實(shí)現(xiàn)
3 代碼實(shí)現(xiàn)
#include <iostream>
#include <stack>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int value;
struct node *next;
} Node;
/**
*把鏈表的每一個(gè)元素遍歷出來(lái)放進(jìn)棧,然后利用
*棧把先進(jìn)后出的特點(diǎn),然后打印棧
*/
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();
}
}
/**
*既然上面用到了棧,那么我們自然而然就會(huì)想到
*用遞歸的思想,我們就自己調(diào)用自己直到遍歷到最后
*很明顯我們遞歸的條件是最后一個(gè)原始的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 運(yùn)行結(jié)果
0
1
2
3
***************
3
2
1
0
***************
3
2
1
0
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)