剑指offer笔记——面试题6:从尾到头打印链表
问题描述:输入一个链表的头节点,从尾到头反过来打印出每个节点的值
代码:
#include <iostream>
#include <stack>
struct ListNode
{
int Key;
ListNode *next;
};
/**
* 从尾到头打印链表
* 利用栈实现
* @param head 链表表头指针
*/
void PrintListReversingly_Iteratively(ListNode *head)
{
std::stack<ListNode*> stack1;
for(ListNode *p = head; p != nullptr; p = p->next)
stack1.push(p);
for(; !stack1.empty();)
{
std::cout << stack1.top()->Key << '\t';
stack1.pop();
}
std::cout << std::endl;
}
/**
* 从尾到头打印链表
* 用递归的方法实现
* @param head 链表表头指针
*/
void PrintListReversingly_Recursively(ListNode *head)
{
if(head != nullptr)
{
if(head->next != nullptr)
PrintListReversingly_Recursively(head->next);
std::cout << head->Key << '\t';
}
}
int main()
{
// 创建单链表,以输入-1为结束标志
std::cout << "Please input the number of the element, use \'-1\' as sign of the end" << std::endl;
int number;
std::cin >> number;
ListNode *head = nullptr;
if(number != -1)
{
head = new ListNode;
ListNode *p = head;
for(; number != -1;)
{
p->Key = number;
std::cin >> number;
if(number == -1)
break;
p->next = new ListNode;
p = p->next;
}
p->next = nullptr;
}
// 顺序打印单链表
for(ListNode *p = head; p != nullptr; p = p->next)
std::cout << p->Key << '\t';
std::cout << std::endl;
// 从尾到头打印链表
PrintListReversingly_Iteratively(head);
PrintListReversingly_Recursively(head);
std::cout << std::endl;
return 0;
}
运行结果: