题目:输入一个链表的头结点,从尾到头反过来打印每个节点的值。
链表定义如下:
链表定义如下:
struct ListNode{
int m_nKey;
ListNode *m_pNext;
};
思路:
无论是否可以修改源链表的结构,从逻辑上将,是完整“遍历”在先,打印输出在后。先进后出,这是stack机制与函数调用机制,因此有两种实现办法
编译环境:ArchLinux+Clang3.3, C++11
实现一:递归版本
#include <iostream>
#include <stack>
using namespace std;
struct ListNode{
int m_nKey;
ListNode *m_pNext;
};
void printList(ListNode *head)
{
if (head){ // 递归终止条件
printList(head->m_pNext); // 类比入栈
cout << head->m_nKey << '\t';
}
}
int main()
{
/** 构建测试链表 **/
ListNode *head = nullptr;
ListNode *ptr = nullptr;
int a[]{1,2,3,4,5};
for(auto i : a) {
ListNode *ptrTmp = new ListNode{i,nullptr};
if (!head){
head = ptr = ptrTmp;
}else{
ptr -> m_pNext = ptrTmp;
ptr = ptr->m_pNext;
}
}
/** 打印 **/
printList(head);
}
实现二:stack版本
#include <iostream>
#include <stack>
using namespace std;
struct ListNode{
int m_nKey;
ListNode *m_pNext;
};
void printList(ListNode *head)
{
stack<ListNode *> st;
ListNode *ptr = head;
while (ptr != nullptr) { // 入栈
st.push(ptr);
ptr = ptr->m_pNext;
}
while (!st.empty()){ // 反向打印
ptr = st.top();
cout << ptr->m_nKey << '\t';
st.pop();
}
}
int main()
{
/** 构建测试链表 **/
ListNode *head = nullptr;
ListNode *ptr = nullptr;
int a[]{1,2,3,4,5};
for(auto i : a) {
ListNode *ptrTmp = new ListNode{i,nullptr};
if (!head){
head = ptr = ptrTmp;
}else{
ptr -> m_pNext = ptrTmp;
ptr = ptr->m_pNext;
}
}
/** 打印 **/
printList(head);
}