题目5:从尾到头打印链表(leetcode链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)
题目分析
思路1:如果题目没有要求要保持原有链表结构,我们可以考虑将链表反转,在进行打印。
思路2:从尾到头打印链表,越靠近头的节点越晚打印,我们可以利用栈的先进后出特点,遍历链表将链表的节点全部入栈在顺序出栈打印即可。
思路3:递归。从尾到头打印链表,我们可以认为是先将链表的后n-1个节点逆序打印,在打印最后一个节点。
代码描述
思路1
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> ret;
if(head == NULL){
return ret;
}
//反转链表
ListNode* cur = head;
ListNode* pre = NULL;
ListNode* next = cur->next;
while(cur){
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head = pre;
//遍历打印
cur = head;
while(cur){
ret.push_back(cur->val);
cur = cur->next;
}
return ret;
}
};
思路2
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack<int> st;
//遍历链表并入栈
ListNode* curr = head;
while(curr){
st.push(curr->val);
curr = curr->next;
}
//出栈并打印
vector<int> ret;
while(!(st.empty())){
ret.push_back(st.top());
st.pop();
}
return ret;
}
};
思路3
class Solution {
public:
void _reversePrint(ListNode* head,vector<int>& ret){
if(head->next == NULL){
ret.push_back(head->val);
return;
}
_reversePrint(head->next,ret);
ret.push_back(head->val);
}
vector<int> reversePrint(ListNode* head) {
vector<int> ret;
if(head == NULL){
return ret;
}
_reversePrint(head,ret);
return ret;
}
};