1 思路:先遍历链表,用一个数组存储链表的值。然后反转该数组,返回该数组即可。
2 核心模块
①遍历链表
我的误区:head是虚拟头结点,不存放有意义的链表数据。
按照题目意思:head中存放链表的第一个数据。
遍历链表:定义指向ListNode类型的指针p,使其指向头结点。仅当p不为空的时候,将p的数据域存入数组,并且将p指向下一个节点。最后返回数组。对应代码:
ListNode * p=head;
while(p!=NULL)
{
Ldata.push_back(p->val);
p=p->next;
}
极端情况说明:如果传入的链表为空,则不进行任何操作,直接返回数组。因为数组仅声明,所以输出为空。
②反转数组
反转数组有三种实现方式:
方式一:自定义实现反转,注意千万不要在数组本身上反转,会覆盖会出错,再定义一个新的数组,将反转后的结果存入新数组。
for(int i=0;i<Ldata.size();i++)
res.push_back(Ldata[Ldata.size()-1-i]);
return res;
方式二:使用algorithm中的reverse()函数,注意reverse函数传入的参数
reverse(Ldata.begin(),Ldata.end());
return Ldata;
方式三:使用vector中的反转迭代器
vector <int> ::reverse_iterator rit=Ldata.rbegin();
for(;rit!=Ldata.rend();rit++)
res.push_back(*rit);
return res;
3 完整代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector <int> Ldata,res;
ListNode * p=head;
while(p!=NULL) //对于头指针的理解有问题,头指针也可以存放链表的有效数据
{
Ldata.push_back(p->val);
p=p->next;
}
//法一:自定义自己实现反转的时候千万不要在数组本身上反转,会覆盖会出错
//for(int i=0;i<Ldata.size();i++)
// res.push_back(Ldata[Ldata.size()-1-i]);
// return res;
//法二:使用algorithm中的reverse()函数
//reverse(Ldata.begin(),Ldata.end());
// return Ldata;
//法三:使用vector中的反转迭代器
vector <int> ::reverse_iterator rit=Ldata.rbegin();
for(;rit!=Ldata.rend();rit++)
res.push_back(*rit);
return res;
}
};
4 收获:
在线编程题如果只有一部分通过率,不一定是没考虑到边界情况,还有可能是逻辑上存在错误。