从尾到头打印链表:最直观的想法是,创建一个新的vector<int>变量result,然后使用一个链表节点指针p指向当前访问的链表节点,p初始化为头节点head,当p不为null时,将p所指向的节点元素值加入到result头部,然后使p指向p的下一个节点,最后返回result。
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
ListNode *p=head;
while(p!=NULL)
{
result.insert(result.begin(),p->val);
p=p->next;
}
return result;
}
idea:从尾到头打印链表,其实相当于逆序输出或者是反转输出,利用该性质,我们可以很自然的想到递归解法。
void dfs(vector<int> &result,ListNode *p)
{
if(p==nullptr) return;
dfs(result,p->next);
result.push_back(p->val);
}
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
ListNode *p=head;
dfs(result,p);
return result;
}
优化:递归本身系统内部会调用栈,那么不妨直接使用栈结构实现,正如同从头到尾访问链表,但是从尾到头打印链表,即先访问的后打印,满足栈先进后出的特点。
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
ListNode *p=head;
stack<int> st;
while(p)
{
st.push(p->val);
p=p->next;
}
while(st.size())
{
result.push_back(st.top());
st.pop();
}
return result;
}



京公网安备 11010502036488号