题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解题思路1:借助栈
第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。典型的“后进先出”,我们可以使用栈来实现这种顺序。每经过一个结点的时候,把该结点放到栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head==NULL){
return vector<int>();
}
vector<int> res;
stack<ListNode*> nodes; //stack类是vector的子类
ListNode* pNode=head;
while(pNode!=NULL){
nodes.push(pNode);
pNode=pNode->next;
}
while(!nodes.empty()){
pNode=nodes.top();
res.push_back(pNode->val);
nodes.pop();
}
return res;
}
};
2、借助vector的insert()函数
那是因为vector的insert的函数原型是:iterator insert (iterator position, const
value_type& val);
vector容器的成员函数insert()把一个或多个对象插入到iterator指示的位置。所查找的元素将出现在iterator指出的位置之前。
C++容器的insert()函数有以下三种用法: 最终*it=val;
//用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器,
iterator insert( iterator it, const TYPE &val );
//用法2:在指定位置it前“插入”num个值为val的元素
void insert( iterator it, size_type num, const TYPE &val );
//用法3:在指定位置it前“插入”区间[start, end)的所有元素.
void insert( iterator it, input_iterator start, input_iterator end );
举例:
//创建一个vector,置入字母表的前十个字符
vector <char> charV;
for( int i=0; i < 10; i++ )
charV.push_back( i + 65 );
//插入四个C到vector中
vector <char>::iterator it = charV.begin();
charV.insert( it, 4, 'C' );
//显示vector的内容
for( it = charV.begin(); it != charV.end(); it++ )
cout < < *it;
这段代码将显示: CCCCABCDEFGHIJ
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> value;
if(head!=NULL) {
value.insert(value.begin(),head->val); //将第一个值存放value中
while(head->next!=NULL) {
value.insert(value.begin(),head->next->val); //依次将链表的值插入到value第一个数的前面,故实现了链表的倒序
head=head->next;
}
}
return value;
}
};