输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表节点定义如下:
struct ListNode {
int m_nKey;
ListNode* next;
ListNode(int num) {
m_nKey = num;
next = nullptr;
}
};
笔者的思路是把链表从头到尾节点的值放进栈里面,然后出栈打印;
空间效率为O(n),时间效率为O(n);
代码如下:
#include <stack>
struct ListNode {
int m_nKey;
ListNode* next;
ListNode(int num) {
m_nKey = num;
next = nullptr;
}
};
void printListnodeNum(ListNode* list) {
if (list == nullptr) return;
std::stack<int> listNodeNum;
ListNode* tempNode = list;
while (tempNode) {
listNodeNum.push(tempNode->m_nKey);
tempNode = tempNode->next;
}
while (!listNodeNum.empty()) {
printf("%d\t", listNodeNum.top());
listNodeNum.pop();
}
printf("\n");
}
int main() {
ListNode* list = new ListNode(0);
ListNode* tempNode = list;
for (int i = 1; i < 10; ++i) {
ListNode* node = new ListNode(i);
tempNode->next = node;
tempNode = tempNode->next;
}
printListnodeNum(list);
ListNode* list1 = nullptr;
printListnodeNum(list1);
printListnodeNum(list);
return 0;
}
按照书本作者的递归方法,笔者写的代码如下:
#include <iostream>
struct ListNode {
int m_nKey;
ListNode* next;
ListNode(int num) {
m_nKey = num;
next = nullptr;
}
};
void printListnodeNum1(ListNode* list) {
if (list == nullptr) return;
printListnodeNum1(list->next);
printf("%d\t", list->m_nKey);
}
int main() {
ListNode* list = new ListNode(0);
ListNode* tempNode = list;
for (int i = 1; i < 10; ++i) {
ListNode* node = new ListNode(i);
tempNode->next = node;
tempNode = tempNode->next;
}
printListnodeNum1(list);
printf("\n");
ListNode* list1 = nullptr;
printListnodeNum1(list1);
printf("\n");
printListnodeNum1(list);
printf("\n");
return 0;
}
欢迎大家指出来文章的错误,或者可以基于文章的信息对我提出问题。