输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:
{1,2,3}
返回值:
[3,2,1]
示例2
输入:
{67,0,24,58}
返回值:
[58,24,0,67]
c++解法:
(1)这里使用三次异或交换两数方法,详细原理可参考这个博客
(2) 数组首尾交换时,循环只需要数组长度的一半即可,>>1表示对整数除以2,也可以使用/2,二者区别如下:
操作对象类型不同:
>>是右移符百号,它在操度作时只允许整数
/是除法,它可以操作不同类型的数据:浮点数除法最终结果是浮点数,整数除法的最终结果是整数。
只有当被操作数数据类型为知大于0的整数时,运算道结果才是内相同的。
运算效率不同:
右移操作通常情况下,会比整数除法速度快。涉及容到浮点数的除法速度是最慢的。
优先级不同:
右移运算的优先级比除法低,在同时参与的运算中,先计算乘除,后计算左移或右移
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
#include <vector>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> rst;
//将链表的值一次存入一维数组rst
while (head != nullptr) {
rst.push_back(head->val);
head = head->next;
}
int sz = rst.size();
for (int i = 0; i < (sz>>1); i++) {
rst[i] ^= rst[sz-1-i];
rst[sz-1-i] ^= rst[i];
rst[i] ^= rst[sz-1-i];
}
return rst;
}
};