【题目描述】
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
说明:本题目包含复杂数据结构ListNode,
【官方解法】
1.使用std::reverse()函数
此函数是将vector内容反转。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ret;
while (head) {
ret.push_back(head->val);//pHead->val就是第一个元素值。
head = head->next; //next见ListNode内容,将指针向后移一位。
}
std::reverse(ret.begin(), ret.end());
return ret;
}
};
2.递归版本
vector<int> printListFromTailToHead(ListNode* head) {
vetor<int> ret;
if (!head)
return ret;
ret = printListFromTailToHead(head->next);//这里是递归的重点。
ret.push_back(head->val);//push_buck的是每次的头元素
return ret;
}
对于递归的问题可以看如下python代码:
意思就是在一个函数中调用函数本身,直到达到条件结束。
def count(list):
if list == []:
return 0
return 1 + count(list[1:])
print(count([1,2,3]))//计算输入的数组的长度
//调用此函数后,就是
1.1+count([2,3])
2.1+1+count([3])
3.1+1+1
3.反转链表 (具体图解见JZ15的方法2)
vector<int> printListFromTailToHead(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode temp = cur;
while (cur) {
temp = cur->next; //需要现保存一下,不然断开了就找不到了
cur->next = pre;
pre = cur; // pre 和 cur分别向右边平移
cur = temp;
}
vector<int> ret;
while (pre) {
ret.push_back(pre->val);
pre = pre->next;
}
return ret;
}
//此方法就是前后颠倒
【B站解法】
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
/*
ListNode* p = head;
stack<int> stk;
vector<int> result;
while(p != NULL)
{
stk.push(p -> val);
p = p -> next;
}
int len = stk.size();
for(int i = 0; i < len; i ++)
{
result.push_back(stk.top());//top()从最后push进去的屁股那里取出
stk.pop();//弹出屁股那里的元素
}
return result;
*/
ListNode* p = head;
vector<int> result;
while(p != NULL)
{
result.push_back(p -> val);
p = p -> next;
}
return vector<int>(result.rbegin(), result.rend());
//rbegin,rend与官方解法的reverse()意思相同
}
};
总结:题目要求很简单,但解法灵活,有些高级用法以及不知道的函数可能导致解题不好,需要积累!!!