题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
思路
四种种解法:reverse反转法、堆栈法、递归法、改变链表结构法
- reverse反转法
vector<int> res;
while(head){
res.push_back(head->val);
head = head->next;
}
//使用algorithm算法中的reverse反转res
reverse(res.begin(),res.end());
return res
- 堆栈法
//借助数据结构栈实现
vector<int> res;
stack<int> s;
//入栈
while(head){
s.push(head->val);
head = head->next;
}
//出栈
while(!s.empty()){
res.push_back(s.top());
s.pop();
}
return res;
- 递归法
//利用递归回溯实现
//自定义函数
vector<int> res;
if(head == nullptr)
return res;
reversePrint(head->next);
res.push_back(head->val);
return res;
- 改变链表结构法
//方法4:改变链表结构
vector<int> res;
ListNode *pre = nullptr;
ListNode *next = head;
ListNode *cur = head;
while(cur){
next = cur->next;//保存当前结点的下一个节点
cur->next = pre;//当前结点指向前一个节点,反向改变指针
pre = cur;//更新前一个节点
cur = next;//更新当前结点
}
while(pre){//上一个while循环结束后,pre指向新的链表头
res.push_back(pre->val);
pre = pre->next;
}
return res;