题目描述
输入一个链表,从尾到头打印链表每个节点的值。
要求接口为: vector<int> printListFromTailToHead(ListNode* head);
解析:
遍历链表,但遍历的顺序是从头到尾,可输出是从尾到头,明显是要进行转换
方法一:利用vector的reverse函数
/*
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
struct ListNode * pNode = head;
while(pNode != NULL)
{
result.push_back(pNode->val);
pNode = pNode->next;
}
reverse(result.begin(), result.end());
return result;
}
};
方法二:先将链表反转,在放入容器输入
不用递归实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
struct ListNode *lpre = head;
struct ListNode *lcur = lpre->next;
struct ListNode *lnext = NULL;
while(lcur != NULL)
{
lnext = lcur->next;
lcur->next = lpre;
lpre = lcur;
lcur = lnext;
}
head->next = NULL;
while(lpre != NULL)
{
result.push_back(lpre->val);
lpre = lpre->next;
}
return result;
}
};
用递归实现链表反转,这个不好用在完成这个接口上
void printListFromTailToHead(ListNode* pListHead){
if(pListHead!=NULL){
//print the next node first
if(pListHead->next!=NULL){
printListFromTailToHead(pListHead->next);
}
// And then print the current node
print("%d",pListHead->val);
}
}
方法三:vector和stack共同完成
后入先出很容易想到栈吧
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<struct ListNode*>Nodes;
struct ListNode* pNode = head;
while(pNode != NULL)
{
Nodes.push(pNode);
pNode = pNode->next;
}
while(!Nodes.empty())
{
pNode = Nodes.top();
result.push_back(pNode->val);
Nodes.pop();
}
return result;
}
};